我提供了一个支持功能栏()的库。传入标量值(如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&amp; (因为const&amp;可以引用r值)。
我的问题是“有没有一种方法可以支持每个标量值而无需明确地将它们调出来?”我真的不想打出所有可能的类型,因为......嗯......有很多。我将不得不涵盖从char到long long的所有内容,包括volatile和unsigned的所有组合,等等。
我知道只需将4更改为4.0即可,但这适用于库的公共接口,并要求用户键入4.0
而不是4
只是很脏。
答案 0 :(得分:4)
是的,有特征:
#include <type_traits>
#include <iostream>
class Foo
{
public:
template <class T>
typename std::enable_if<!std::is_scalar<T>::value, void>::type bar(T const & rhs)
{
std::cout << "T" << std::endl;
}
void bar(double rhs)
{
std::cout << "double" << std::endl;
}
};
有六种基本类型:标量,函数,数组,类,联合和引用。并void
。他们每个人都有相应的特质。 See here for more details.