gpt4 book ai didi

c++ - 如何构造一个可以调用和返回两种不同类型的模板

转载 作者:行者123 更新时间:2023-11-30 01:36:03 24 4
gpt4 key购买 nike

我正在编写一些代码,其中我有两个类,每个类都有一个方法,该方法返回具有特定值的所述类。现在这两个类有不同的名称,返回具有特定值的类的方法有不同的名称,但值是相同的。

例子

   class_a a = class_a::get_value_a()
class_b b = class_b::get_value_b()

a.value() == b.value() is true

现在我要做的是使用模板获取此值的通用方法

例子

   class_generic g_a = class_generic::get_value<class_a>();
class_generic g_b = class_generic::get_value<class_b>();

g_a.value() == g_b.value() is true

但是在制作模板时我尝试执行以下操作

template <typename T> T class_generic::get_value()
{
if (typeid(T).hash_code() == typeid(class_a).hash_code())
{
return class_a::get_value_a()
}
if (typeid(T).hash_code() == typeid(class_b).hash_code())
{
return class_b::get_value_b();
}
}

但这不会编译,在我看来它试图解析两种返回类型并转换一种。

那么我该如何正确地做到这一点呢?

问候

最佳答案

可以申请template specialization .例如

// primary template
template <typename T>
T class_generic::get_value();

// explicit specialization for T = class_a
template <>
class_a class_generic::get_value<class_a>()
{
return class_a::get_value_a();
}

// explicit specialization for T = class_b
template <>
class_b class_generic::get_value<class_b>()
{
return class_b::get_value_b();
}

或申请Constexpr If (C++17 起),其条件在编译时求值,然后可以避免您的代码片段遇到的问题。例如

template <typename T>
T class_generic::get_value()
{
if constexpr (std::is_same_v<T, class_a>)
{
return class_a::get_value_a();
}
else if constexpr (std::is_same_v<T, class_b>)
{
return class_b::get_value_b();
}
else
{
// return something else..
}
}

关于c++ - 如何构造一个可以调用和返回两种不同类型的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52643600/

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