模板扣除评估相同功能的过载

template deduction evaluates to overload of identical functions

本文关键字:功能 评估      更新时间:2023-10-16

我有以下类:

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

现在问题是,如果我实例化了Foo<double>类型的对象,我将获得两个具有相同签名的过载功能。

有什么方法可以解决吗?

我的问题是,我确实需要处理val类型double特殊的情况。此外,非双重类型的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";
}

您可以创建模板专业化。在模板类或功能的专业化中,您为某种类型定义了独特的行为。例如:

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