2

我正在提供一个支持函数 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很脏。

4

1 回答 1

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。他们每个人都有相应的特质。有关更多详细信息,请参见此处。

于 2012-10-29T22:32:25.640 回答