我有以下类(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/