我正在处理一些代码,其中我有两个类,每个类都有一个返回具有特定值的所述类的方法。现在,这两个类具有不同的名称,返回具有特定值的所述类的方法具有不同的名称,但是值是相同的。
例
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();
}
}
但这不会编译,在我看来,它试图解析两种返回类型并转换一种返回类型。
那么我该如何正确执行呢?
问候
您可以应用模板专业化。例如
// 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..
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句