c++ - 调用和重载模板函数
问题描述
假设我在下面显示的类中有 2 个重载方法请忽略这种奇怪的方法重载的需要,这是我最近遇到的
class A{
public:
//Lets call this method 1
int GetVal(bool isCondition) const
{
//do something and return val
}
//Lets call this method 2
template<typename T>
int GetVal(T expression)
{
//do something using expression
//and return val
}
};
int main()
{
A obj;
int val = obj.GetVal(false) << std::endl; //I want to invoke method 1
}
在main()
函数中,我想调用 method1 而不是 method2。我怎样才能做到这一点?谢谢阅读
解决方案
在 main() 函数中,我想调用 method1 而不是 method2。我怎样才能做到这一点?谢谢阅读
这正是您所要求的
obj.GetVal(false)
因为false
是 abool
所以它与非模板方法完全匹配。并且当调用与模板方法和非模板方法匹配时,首选非模板方法(在完全匹配的情况下)。
bool
真正的问题是:如何使用非模板方法(方法1)的类型()调用方法2?
答案(一个可能的答案)是:添加一个template
调用它
obj.template GetVal(false)
以下是一个完整的工作示例
#include <iostream>
struct A
{
//Lets call this method 1
int GetVal (bool)
{ return 1; }
//Lets call this method 2
template <typename T>
int GetVal (T)
{ return 2; }
};
int main ()
{
A obj;
std::cout << obj.GetVal(false) << std::endl; // print 1
std::cout << obj.template GetVal(false) << std::endl; // print 2
}
- 编辑 -
鉴于 OP 精确地认为方法 1 是const
(而方法 2 不是),方法 2 成为更好的匹配。
这个问题可以通过修改A
Jarod42 的答案(添加一个调用 const 方法的非 const 非模板方法或 SFINAE 在T
is时禁用模板方法 2 bool
)或 Wanderer 的答案(const
也制作方法 2)来解决。
但是如果你不想(或者你不能)修改类A
,你可以static_assert()
直接在main()
std::cout << static_cast<A const &>(obj).GetVal(false) << std::endl;
推荐阅读
- r - 检查矩阵行中的每两个相邻元素
- java - 我应该在运行 Statement.executeUpdate 方法之前从 SQL/PLSQL 文件内容中删除注释吗
- php - 使用用户实体进行身份验证时如何在 Symfony 4 中使用独立的基本身份验证
- java - Java:为特殊含义替代 null
- tfs - 如何将新代码周期设置为最后一个绿色质量门
- javascript - 有没有办法从 JavaScript 文件中获取所有导出的名称?
- c# - XML 文档注释与 ASP.NET 和 EF6 中的数据库优先模型
- csv - 将包含控制器与动态路径一起使用
- python-3.x - 如何从输入命令中搜索包含特定字符的单词?
- azure - 无法在我的 Azure 实例上创建表单识别器资源