【问题标题】:Writing a template function for basic and Eigen data types为基本和特征数据类型编写模板函数
【发布时间】: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&lt;double&gt;() 完成的,因此模板参数是标量的数据类型,而不是新类型本身。

我遇到的问题(至少我认为这是主要问题)是我不知道如何将这两个模板放在一起。 Eigen 应该是第一个的专业化,但这可能吗?模板本身可以编译,但例如cast&lt;Vector2f, double&gt;(Vector2f::Zero()) 不会,因为 'static_cast' : 无法从 'const Eigen::Vector2f' 转换为 'double'

怎么办?非常欢迎C++11解决方案,但请慢慢输入,因为我不是模板向导。

更新: 我需要这个的原因是我希望能够方便地将容器的内容转换为std::vector&lt;T&gt;std::vector&lt;N&gt;,例如std::vector&lt;Vector2f&gt;std::vector&lt;Vector2d&gt;,也可以从std::vector&lt;float&gt;std::vector&lt;double&gt;。为此,我遍历所有元素并使用所需的函数对每个元素进行强制转换。因此,如果有更好的方法来转换特征类型的 std::vector,这将是我所需要的。

【问题讨论】:

    标签: c++ templates c++11 eigen eigen3


    【解决方案1】:

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

    【讨论】:

    • 这是一个非常简单的解决方案!感谢您的快速帮助!不过,函数名前面的 N 应该被删除。
    【解决方案2】:

    对于 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 */
    }
    

    这样一来,一切尽在一个函数中,而且我发现语法更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2011-09-08
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多