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

lac*_*lan 8 c++ templates class return-type c++11

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

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

这将导致c成为float

请注意,我仅限于只能使用或更低版本的功能。

Jer*_*man 13

您可以使用decltype以下方法:

using result_type = decltype(std::declval<TA&>() * std::declval<TB&>())
Run Code Online (Sandbox Code Playgroud)


Nat*_*ica 10

您可以使用decltypestd::declvaldecltype会为您提供表达式的类型,并std::declval会为您“创建”该类型的对象,即使它不能/您不知道如何构造它也是如此。那给你像

using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());
Run Code Online (Sandbox Code Playgroud)

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


JeJ*_*eJo 5

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

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

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

看网上直播