我正在提供一个支持函数 bar() 的库。传入标量值(如 double、int 等)时的作用与传入非标量值(在所有预期情况下,用户定义类型)时发生的情况不同。所以我写了这样的代码:
#include <iostream>
class Foo
{
public:
template <class T> void bar(T const &rhs) { std::cout << "T" << std::endl; }
void bar(double rhs) { std::cout << "double" << std::endl; }
};
int main()
{
Foo foo;
foo.bar(4);
}
问题出在 main() 的第二行。此代码的结果是“T”的输出。编译器更喜欢模板而不是对 bar(double) 的调用,我假设这是因为参数是 int,它宁愿将其强制转换为 int const&(因为 const& 可以引用 r 值)。
我的问题是“有没有一种方法可以支持每个标量值而无需明确指出它们?” 我真的不想说出所有可能的类型,因为……嗯……有很多。我必须涵盖从 char 到 long long 的所有内容,包括 volatile 和 unsigned 的每种组合,等等。
我知道只需将 4 更改为 4.0 即可,但这是用于库的公共接口,并且要求用户键入4.0
而不是4
很脏。