2015-11-04 137 views
1

如何編寫同時採用基本數據類型(int,float,double,...)和特徵庫類型(Vector2f,Vector4d,Matrix4f,...)的函數?具體而言,我想要的施放提供的參數的鑄造功能鍵入N.爲基本數據類型和特徵數據類型編寫模板函數

例如:

float x1 = cast<float>(1); 
double x2 = cast<double>(2.0); 
Vector2d x3 = cast<double>(Vector2f(3.0f, 3.0f)); 
Vector2f x4 = cast<float>(Vector2i(4, 4)); 

容易的部分:

template<typename T, typename N> 
N cast(const T& source) const 
{ 
    return static_cast<N>(source); 
} 

鑄造一個本徵類型:

template<typename T, typename N> 
Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<typename Eigen::internal::traits<T>::Scalar, N>, const T> cast(const Eigen::MatrixBase<T>& source) const 
{ 
    return source.cast<N>(); 
} 

在Eigen中,從Vector2f v轉換爲Vector2d由v.cast<double>()完成,所以模板參數是標量的數據類型,而不是新類型本身。

我有麻煩(至少我認爲這是主要問題)是我不知道如何將這兩個模板放在一起。 Eigen可能應該是第一個的專業化,但這甚至有可能嗎?模板本身編譯,但例如cast<Vector2f, double>(Vector2f::Zero())不會,因爲'static_cast':不能從'const Eigen :: Vector2f'轉換爲'double'

怎麼辦? C++ 11解決方案非常受歡迎,但請輸入緩慢,因爲我不是模板嚮導。

更新: 我之所以需要這個是我希望能夠方便地施展內容的容器,std::vector<T>std::vector<N>,例如std::vector<Vector2f>std::vector<Vector2d>,但也從std::vector<float>std::vector<double>。爲此,我循環遍歷所有元素並將其轉換爲所需的函數。因此,如果有更好的方法來投射特徵類型的std :: vector,這將是我需要的。

回答

3

您可以使用std::enable_if限制普通版只算術類型:

template<typename T, typename N> 
typename std::enable_if<std::is_arithmetic<T>::value,N>::type 
cast(const T& source) const { 
    return static_cast<N>(source); 
} 
+0

這是一個令人驚訝的簡單的解決方案!感謝您的快速幫助!不過,函數名稱前面的N應該被刪除。 – mOfl

相關問題