如何編寫同時採用基本數據類型(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,這將是我需要的。
這是一個令人驚訝的簡單的解決方案!感謝您的快速幫助!不過,函數名稱前面的N應該被刪除。 – mOfl