gpt4 book ai didi

c++ - 调用和重载模板函数

转载 作者:太空狗 更新时间:2023-10-29 20:33:26 24 4
gpt4 key购买 nike

假设我在如下所示的类中有 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() 函数中,我想调用方法 1 而不是方法 2。我怎样才能做到这一点?感谢阅读

最佳答案

In the main() function, I want to invoke method1 and not method2. How can I achieve this? Thanks for reading

这正是您要调用的内容

obj.GetVal(false)

因为falsebool所以它与 not-template 方法完全匹配。当调用与模板方法和非模板方法匹配时,非模板方法(在完全匹配的情况下)是首选。

真正的问题是:如何调用非模板方法(方法 1)的类型( bool )调用它的 method2?

答案(一个可能的答案)是:添加一个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
}

-- 编辑 --

假设方法 1 的 OP 精确为 const (而方法 2 不是),方法 2 成为更好的匹配。

修改A即可解决问题如 Jarod42 的回答(添加一个非常量非模板方法调用 const 方法或 SFINAE 在 Tbool 时禁用模板方法 2)或如 Wanderer 的回答(使 const 也是方法 2)。

但如果您不这样做,则不会(或者如果您不能)修改类 A , 你可以简单地使用 static_assert()直接在main()

std::cout << static_cast<A const &>(obj).GetVal(false) << std::endl;

关于c++ - 调用和重载模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55271110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com