如何构建可以调用和返回两种不同类型的模板

时间:2018-10-04 09:41:21

标签: c++ templates

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

示例

   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();
  }
}

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

那我该怎么做呢?

致谢

3 个答案:

答案 0 :(得分:4)

您可以申请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..
  }
}

答案 1 :(得分:0)

在当前标准中,这可以通过

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

请注意,如果无法同时编译这两种选择,即代码的一部分仅针对一个模板参数值进行编译,而另一部分针对另一模板参数值进行编译,则它们应为同一if constexpr/else运算符的不同分支。

答案 2 :(得分:0)

除了已经给出的适当解决方案之外,您还应该注意到typeid()是运行时运算符,用于在运行时检查多态类型,无论模板是否是编译时问题。因此,在您的代码中进行模板评估时不会评估typeid。