【发布时间】:2016-02-05 01:24:42
【问题描述】:
如何编写一个同时接受基本数据类型(int、float、double、...)和 Eigen 库类型(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,这将是我所需要的。
【问题讨论】:
标签: c++ templates c++11 eigen eigen3