如何获得将两种不同类型的相乘的结果类型?

How to get resultant type of multiplying two different types?

本文关键字:类型 结果 同类型 何获得 两种      更新时间:2023-10-16

如何获得将两种不同类型相乘的结果类型,即

template< typename TA, typename TB>
struct multiplier
{
using result_type = // something here finds result of TA * TB
result_type operator()( TA a, TB b ) const
{
return a * b;
}
};

我知道C++将两个不同类型的数值相乘是完全有效的,这将给出编译器已知的类型的值。 即,将doubleint相乘将得到double类型的答案。

因此,在编译时类型已知的模板类中,应该可以确定将要创建的类型。 实际上,可以创建一个lambda来返回该值的结果,即

auto foo = [](int a, float b){ return a * b;}
auto c = foo( 13, 42.0 );

这将导致c成为float

请注意,我只能使用 c++11 或更低版本的功能。

您可以使用decltype来执行此操作:

using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());

您可以使用decltypestd::declvaldecltype会给你一个表达式的类型,std::declval会为你"创建"一个类型的对象,即使它不能/你不知道如何构造它。 这给了你类似的东西

using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());

请注意,我正在为该类型使用左值引用。 这样做是因为默认情况下decval会给你一个右值引用,这可能会给你一个不同的类型。

除了其他答案之外,如果您不需要result_type供以后使用,而只是指定operator()的返回类型,还有另一种方法,即不在 c++11 中定义result_type的别名。

您可以提供尾随返回类型以及auto返回,如下所示:

template< typename TA, typename TB>
struct multiplier
{
auto operator()(TA a, TB b) const -> decltype(a * b)
//  ^^^^^                             ^^^^^^^^^^^^^^^^^^^
{
return a * b;
}
};

(在线观看直播)