2015-11-04 186 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

相关问题