gpt4 book ai didi

c++ - 带有派生类的c++模板特化

转载 作者:行者123 更新时间:2023-12-01 14:42:11 24 4
gpt4 key购买 nike

我在尝试专门化类的模板方法以接受派生类时遇到问题。我也尝试过使用指针,但最终会遇到比此迭代更多的问题。

#include <iostream>

using namespace std;

class Json {
public:
Json(){}
virtual ~Json(){}
template <class T>
bool Get(std::string key, T& value);
};

template <class T>
bool Json::Get(std::string key, T& value){
std::cout << "Call default GET" << std::endl;
}

template <>
bool Json::Get(std::string key, Json& value){
std::cout << "Call JSON GET" << std::endl;
}

class JsonError : public Json {
public:
JsonError(){}
~JsonError(){}
};

int main()
{
// OK
int int_value = 0;
Json json;
json.Get("int", int_value);

// OK
Json json_value;
json.Get("json", json_value);

// NOT OK
JsonError json_error_value;
json.Get("error", json_error_value);

return 0;
}
这应该打印出来
Call default GET                                                                                                                                            
Call JSON GET
Call JSON GET

最佳答案

模板不是这样工作的。模板推导始终使用确切的类型,在这种情况下为JsonError,因此Json&的特化不匹配。
如果仍要使其工作,则可以使用Json&的成员函数来重载模板函数。模板函数仍然可以更好地匹配派生类型,因此我们还需要针对从Json派生的任何类型禁用模板方法。

#include <iostream>

class Json {
public:
Json(){}
virtual ~Json(){}
template <class T, std::enable_if_t<!std::is_base_of_v<Json, T>, int> = 0>
bool Get(std::string key, T& value);

bool Get(std::string key, Json& value);
};

template <class T, std::enable_if_t<!std::is_base_of_v<Json, T>, int> = 0>
bool Json::Get(std::string key, T& value){
std::cout << "Call default GET" << std::endl;
return true;
}

bool Json::Get(std::string key, Json& value){
std::cout << "Call JSON GET" << std::endl;
return true;
}

class JsonError : public Json {
public:
JsonError(){}
~JsonError(){}
};

int main()
{
// OK
int int_value = 0;
Json json;
json.Get("int", int_value);

// OK
Json json_value;
json.Get("json", json_value);

// NOW IT'S OK
JsonError json_error_value;
json.Get("error", json_error_value);

return 0;
}

关于c++ - 带有派生类的c++模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63600072/

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