模板推导计算为相同函数的重载

template deduction evaluates to overload of identical functions

我有以下 class:

template <typename T>
struct Foo {
  void bar(double val);
  void bar(T val);
  T m_val;
};

现在的问题是,如果我实例化一个 Foo<double> 类型的对象,我会得到两个具有相同签名的重载函数。

有什么办法吗?

我的问题是我确实需要处理 val 属于 double 特殊类型的情况。此外,非double类型的bar参数没有公共superclass.

您可以创建模板专业化。在模板 类 或函数的特化中,您可以为特定类型定义独特的行为。例如:

template<typename T>
struct Foo {
   void bar(T);
   T m_val;
}

template <>
struct Foo<double> {
   void bar(double);
   double m_val;
};

或者您可以针对这种情况只特化一个函数:

template <>
void Foo<double>::bar(double); 

现在当您执行以下操作时:

int main() {
   Foo<double> ob1;
   Foo<int> obj2;

   obj1.bar(1,3);
   obj2.bar(45);
   return 0;
}

obj1.bar 从专业化中调用 bar 函数。

另一种方法是使用 SFINAE 禁用功能:

#include <iostream>
#include <string>
#include <vector>

template <typename T>
struct Foo {
 void bar(double val){
     std::cout << "bar(double)\n";
 }

  template<class Y=T>
  typename std::enable_if<!std::is_same<Y, double>::value>::type  
  bar(T val){
      std::cout << "bar(T)\n";
      }

  T m_val;
};

int main()
{
  Foo<double> dd;
  dd.bar(1.0);

  Foo<std::string> dd2;
  dd2.bar("asds");
  dd2.bar(1.0);
}

[编辑]

正如 W.F 在评论中指出的那样,您在这里不需要 enable_if,使 bar(T) 成为模板成员函数就足以消除歧义:

template<int=0>
void bar(T val){
  std::cout << "bar(T)\n";
}