如何编写同时采用基本数据类型(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