我对带有两个输入和需要派生的类型的基于模板的乘法功能感到困惑。我应该如何导出函数的类型?
template<typename T, typename U>
DERIVED_TYPE multiply(T t, U u) {
return t * u;
}
好吧,我知道auto
或decltype(auto)
可以很好地完成工作,但是如果可以的话,我想换一种方式,学习是一个原因。例如,对于Eigen,
DERIVED_TYPE multiply(Matrix<int, 2, 3> t, Matrix<double, 3, 4> u) {
return t * u;
}
DERIVED_TYPE
当然应该是Matrix<double, 2, 4>
。
答案 0 :(得分:3)
在这种情况下:
DERIVED_TYPE multiply(Matrix<int, 2, 3> t, Matrix<double, 3, 4> u) {
return t * u;
}
您可以使用std::common_type
来导出double
和int
的通用类型:
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;
}
来避免复制大类型。