模板扣除评估相同功能的过载
template deduction evaluates to overload of identical functions
我有以下类:
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函数。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- std::condition_variable::wait()如何评估给定的谓词
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 未评估上下文中的默认模板参数和 lambda:错误还是功能?
- C 17带有运营商超载功能的评估顺序
- 模板扣除评估相同功能的过载
- 评估采用函数参数的元功能,干燥,而无需使用宏
- C++:传递结构与提供评估器功能