模板推导评估相同函数的重载

时间:2016-12-08 23:45:59

标签: c++ c++11 templates overloading

我有以下课程:

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

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

周围有什么办法吗?

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

2 个答案:

答案 0 :(得分:6)

另一个方法是禁用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";
}

答案 1 :(得分:5)

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

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函数。