非内置函数的模板,内置函数的重载

时间:2012-10-29 22:30:35

标签: c++ templates overloading overload-resolution

我提供了一个支持功能栏()的库。传入标量值(如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只是很脏。

1 个答案:

答案 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.