[英]Return type of template function
信息:
我目前正在嘗試學習模板元編程(通過閱讀本書 )。 他們給出的一個有用的例子是尺寸分析。 我在書中實現了它,一切都很好; 看到這里 。
然而,我的問題是,我想使用混合類型的維度分析框架。 通過這個我的意思是你可以說一個標量的質量乘以一個矢量與加速度的維度,以給出一個矢量力。 由於它位於鏈接中,因此它們僅使用相同類型T
進行所有操作的輸入和輸出。
我有一個3向量類,它具有所有必要的操作,用於乘以/除以標量等,所以我想做類似的事情
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
它仍然是一個vect
。 更差; 原則上,返回類型可以是任何東西。 所以我想要一種方法將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());
}
其中X
是q1.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的建議編輯了代碼,因此不需要default-constructible類型。 只是不要忘記包含<utility>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.