如何导出模板函数的输出类型?

时间:2019-02-11 17:11:06

标签: c++ templates c++17

我对带有两个输入和需要派生的类型的基于模板的乘法功能感到困惑。我应该如何导出函数的类型?

template<typename T, typename U>
DERIVED_TYPE multiply(T t, U u) {
    return t * u;
}

好吧,我知道autodecltype(auto)可以很好地完成工作,但是如果可以的话,我想换一种方式,学习是一个原因。例如,对于Eigen,

DERIVED_TYPE multiply(Matrix<int, 2, 3> t, Matrix<double, 3, 4> u) {
    return t * u;
}

DERIVED_TYPE当然应该是Matrix<double, 2, 4>

2 个答案:

答案 0 :(得分:3)

在这种情况下:

DERIVED_TYPE multiply(Matrix<int, 2, 3> t, Matrix<double, 3, 4> u) {
    return t * u;
}

您可以使用std::common_type来导出doubleint的通用类型:

Matrix< std::common_type<int,double> , 2 , 4>

通常:

template <typename T1, typename T2, size_t m,size_t n,size_t p>
Matrix< std::common_type<T1,T2>, m,p> multiply( Matrix<T1,m,n>, Matrix<T2,n,p>) {
    //...
}

答案 1 :(得分:3)

在C ++ 11中,您可以使用操作本身通过decltype说明符和auto说明符来定义返回类型

av_register_all()

在C ++ 14中,您可以在function declaration

中省略尾随返回类型
template<typename T, typename U>
auto multiply(T const &t, U const &u) -> decltype(t * u)
{
    return t * u;
}

在C ++ 20中,您可以省略template<typename T, typename U> auto multiply(T const &t, U const &u) { return t * u; } 说明符,并使用abbreviated function template语法

template

顺便说一句,我已经使用参数auto multiply(auto const &t, auto const &u) { return t * u; } 来避免复制大类型。