模板推导计算为相同函数的重载
template deduction evaluates to overload of identical functions
我有以下 class:
template <typename T>
struct Foo {
void bar(double val);
void bar(T val);
T m_val;
};
现在的问题是,如果我实例化一个 Foo<double>
类型的对象,我会得到两个具有相同签名的重载函数。
有什么办法吗?
我的问题是我确实需要处理 val
属于 double
特殊类型的情况。此外,非double类型的bar
参数没有公共superclass.
您可以创建模板专业化。在模板 类 或函数的特化中,您可以为特定类型定义独特的行为。例如:
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 函数。
另一种方法是使用 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";
}
我有以下 class:
template <typename T>
struct Foo {
void bar(double val);
void bar(T val);
T m_val;
};
现在的问题是,如果我实例化一个 Foo<double>
类型的对象,我会得到两个具有相同签名的重载函数。
有什么办法吗?
我的问题是我确实需要处理 val
属于 double
特殊类型的情况。此外,非double类型的bar
参数没有公共superclass.
您可以创建模板专业化。在模板 类 或函数的特化中,您可以为特定类型定义独特的行为。例如:
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 函数。
另一种方法是使用 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";
}