推导类型的模板参数表达式

时间:2016-11-09 10:03:19

标签: c++ templates arithmetic-expressions type-deduction

如何推导出模板参数表达式的类型?例如,关于以下代码:

template< typename T >
class A
{
//....
};

template< typename T_1, typename T_2 >
class B
{
  auto foo()
  {
    return A</* Type of "T_1+T_2"*/>();
  }
};

如何推断出T_1+T_2的类型?例如,它可以是T_1=floatT_2=int,因此,foo应该返回A<float>()(因为将integerfloat相加得到float)。

2 个答案:

答案 0 :(得分:3)

您可以使用decltypestd::declval的组合。我还建议输入结果类型以获得更好的可读性:

template< typename T_1, typename T_2 >
class B
{
  typedef decltype(std::declval<T_1>() + std::declval<T_2>()) result_type;
  auto foo() -> result_type
  {
    return A<result_type>();
  }
};

答案 1 :(得分:2)

您可以decltype使用std::declval

return A<decltype(std::declval<T_1>() + std::declval<T_2>())>();

decltype为您提供表达式的类型。 std::declval创建了一个无处不在的类型的引用,以便在decltype表达式中使用。