繁体   English   中英

为基本和特征数据类型编写模板函数

[英]Writing a template function for basic and Eigen data types

我如何编写一个函数,它采用基本数据类型(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,这将是我所需要的。

您可以使用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);
}

对于 C++17,还有另一种解决方案,我个人觉得它更优雅,使用if constexpr

template<typename T, typename N>
std::conditional<std::is_arithmetic<T>::value, N, /* your Eigen return type here */>::type
cast( const T& source ) {
    if constexpr( std::is_arithmetic<T>::value )
        return static_cast<N>(source);
    else
        /* Eigen cast */
}

这样,所有功能都在一个函数中,而且我发现语法更清晰一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM