c++ - 模板函数的返回类型

标签 c++ templates c++11 decltype

信息:

我目前正在尝试学习模板元编程(通过关注 this book)。他们给出的一个有用的例子是维度分析。我按照书中的方式实现了它,一切都很好; see here .

但是,我的问题是,我想使用具有混合类型的维度分析框架。我的意思是你可以说一个标量与质量维度乘以 vector 与加速度维度给出 vector 力。由于它位于链接中,因此它们仅使用相同类型的 T 进行所有操作的输入和输出。

我有一个 3 vector 类,它具有与标量相乘/除以等所有必要的操作,所以我想做类似的事情

quantity<double,mass> m(1.0);
quantity<vect,acceleration> a(vect(0.0,0.0,-9.81));
quantity<vect,force> f = m*a;

第一次尝试:

为了实现这一点,我尝试扩展书中的示例以处理两种不同的类型作为 operator*operator/ 的输入,但是当涉及到返回类型。

我知道 double * vect 的返回类型是 vect 但如果它们是相反的 vect * double 它仍然是一个 vector 。更差;原则上返回类型可以是任何类型。所以我想要一种方法将 operator* 扩展为类似

的东西
template<class T1, class T2, class Dim1, class Dim2>
quantity<X, typename boost::mpl::transform<Dim1,Dim2,boost::mpl::plus<_1,_2> >::type>
operator*(const quantity<T1,Dim1>& q1, const quantity<T2,Dim2>& q2)
{
    return quantity<X,
                    typename boost::mpl::transform<Dim1,Dim2,boost::mpl::plus<_1,_2> >::type>
                   (q1.value()*q2.value());
}

其中 Xq1.value()*q2.value() 的返回类型,在编译时推导。我尝试简单地向签名添加另一个模板类 T3 并让它返回 T3 但它似乎无法推断出 T3 应该是什么。

第二次尝试:

接下来我尝试使用 decltype 如下

template<class T1, class T2>
struct return_type
{
    auto mult_f(const T1& a, const T2& b)->decltype(a*b){return a*b;}
    typedef decltype(mult_f) type;
};

template<class T1, class T2, class Dim1, class Dim2>
quantity<typename return_type<T1,T2>::type, typename boost::mpl::transform<Dim1,Dim2,boost::mpl::plus<_1,_2> >::type>
operator*(const quantity<T1,Dim1>& q1, const quantity<T2,Dim2>& q2)
{
    return quantity<typename return_type<T1,T2>::type,
                    typename boost::mpl::transform<Dim1,Dim2,boost::mpl::plus<_1,_2> >::type>
                   (q1.value()*q2.value());
}

然而,这会引发大量无法理解的编译器错误。

问题:

我的问题是,我是否以正确的方式使用 decltype 但缺少一些语法,例如某处的 typename 说明符?要么;是否有可能以这种方式执行此操作?如果不能,如何计算函数的返回类型?

谢谢。

最佳答案

好的,首先输入 return_type<T1,T2>::type不是您所期望的,而是方法的类型,即 T3 (return_type::*)(const T1&, const T2&)T3成为您期望的类型。如果你想使用中间类,你可以使用:

template <typename T1, typename T2>
struct return_type
{
  typedef decltype(std::declval<T1>()*std::declval<T2>()) type;
};

但你也可以直接使用decltype(T1()*T2())获取产品的类型。

编辑:我根据 ildjarn 的建议编辑了代码,因此不需要默认可构造类型。只是不要忘记包括 <utility>

关于c++ - 模板函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11097823/

相关文章:

c++ - 海森堡 : WinApi program crashes on some computers

c++ - 需要帮助理解指针练习的输出

c# - VisualStudio 多项目模板

c++ - 类型索引元组

c++ - 具有连续存储的动态矩阵

C++货币转换代码

c++ - 链接器看不到 .lib 内的函数

c++ - 将自身称为模板模板参数的模板类?

c++ - 我怎样才能将 std::map 的迭代器递减一定数量?

c++ - 以内部模板化 typedef 作为参数的模板化延迟初始化单例