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

Deducing type of template parameter expression

本文关键字:表达式 类型 参数      更新时间:2023-10-16

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

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>()(因为将一个integer与一个float相加得到一个float)。

可以使用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>();
  }
};

您可以使用decltypestd::declval:

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

decltype给出了表达式的类型。

std::declvaldecltype表达式中创建了对某个类型的引用。
相关文章: