如何推导出模板参数表达式的类型?例如,关于以下代码:
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=float
和T_2=int
,因此,foo
应该返回A<float>()
(因为将integer
与float
相加得到float
)。
答案 0 :(得分:3)
您可以使用decltype
和std::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
表达式中使用。