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

标签 c++ c++11 templates overloading

我有以下类(class):

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

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

有什么办法吗?

我的问题是我确实需要处理 val 的情况类型为 double特别的。此外,bar非 double 类型的参数没有公共(public)父类(super class)。

最佳答案

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

关于c++ - 模板推导计算为相同函数的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41050836/

相关文章:

c++ - C++中调用基类模板构造函数

c++ - 通过指向在另一个线程上执行的函数的指针传递堆栈分配的对象

c++ - 表示范围所需位的编译时计算

templates - Eclipse CDT 新项目模板 - 如何添加库

c++ - 变体类型和可变参数模板的转换和输出运算符

c++ - 当使用 std::vector::push_back 插入未知数量的元素时,是否应该在每次推送时检查 std::vector::max_size?

c++ - 保鲜膜效果

c++ - VS 2012 中的条件运算符类型转换

c++ - 通用成员函数定义

c++ - 当对象超出范围时是否调用析构函数?