我有以下课程:
template <typename T>
struct Foo {
void bar(double val);
void bar(T val);
T m_val;
};
现在的问题是,如果我实例化Foo<double>
类型的对象,我会得到两个具有相同签名的重载函数。
周围有什么办法吗?
我的问题是我确实需要处理val
类型double
特殊的情况。此外,非double类型的bar
参数没有共同的超类。
答案 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函数。