检查类型是否为Eigen3类型

詹卢卡

Eigen3与内置类型的兼容性

大家好。我陷入了编写可以处理Eigen3类型(矩阵和数组)和内置类型的例程的问题。我可以用一个示例来最好地解释这一点:假设我有一个Meter<Type>模板类,它能够在运行时收集统计信息。

Type类应支持以下运算符:

  • operator=(Scalar)
  • operator=(Type)
  • operator+(Type)
  • operator-(Type)
  • operator*(Type)
  • operator/(Type)
  • operator*(Scalar)
  • operator/(Scalar)

Eigen3类型提供了所有这些运算符的有两个例外:首先,operator*(Type)如果代表点preductType是一些子类,Eigen::MatrixBase并且表示系数之积,如果Type是的一些亚类Eigen::ArrayBase我可以轻松解决此问题;第二,没有人实现operator=(Scalar)确保正确初始化为零的要求。

我尝试实现以下仿函数类来帮助我处理区别,但是我无法使它们起作用:

处理内置类型和Eigen3类型之间区别的一些结构

template < class _Type > struct is_scalar : true_type {
    using Scalar = _Type;
    using Type = _Type;

    static constexpr bool value = true;
};

template < class _Matrix >
struct is_scalar<Eigen::MatrixBase<_Matrix>> : false_type {
    using Scalar = typename Matrix::Scalar;
    static constexpr bool value = false;
};

template < class _Array >
struct is_scalar<Eigen::ArrayBase<_Array>>  : false_type {
    using Scalar = typename Array::Scalar;
    static constexpr bool value = false;
};

函数实现本身

template < class Scalar, bool is_scalar = Math::is_scalar<Scalar>::value > 
struct set_const_impl;

template < class Scalar >
struct set_const_impl< Scalar, true > {
    static const void run(Scalar &_x, Scalar _y) noexcept { _x = _y; }
};

template < class EigenType >
struct set_const_impl<EigenType, false> {
    template < class Scalar >
    static const void run(Eigen::EigenBase<EigenType> &_x, Scalar _y) noexcept {
        _x.derived().setConstant(_y);
    }
};

template < class Type, class Scalar > void set_const(Type &_x, Scalar _y) noexcept {
    set_const_impl<Type>::run(_x, _y);
}

template < class Type > void set_zero(Type &_x) noexcept {
    set_const_impl<Type>::run(_x, 0);
}

专用版本set_const_impl<EigenType>永远不会被实例化。例如,如果我打电话

Eigen::Matrix<double, 3, 1> m1; 
set_zero(m1);

我让编译器0在网上抱怨

set_const_impl<Type>::run(_x, 0);

表示0不能隐式转换为Eigen::Matrix<double, 3, 1>,这表示它选择set_const_impl<Scalar, true>了函子版本(两个参数共享一个公共类型Scalar)。这也意味着is_scalar即使在我已经使用过它并且在其他类上没有问题地对其进行过测试的情况下,我的构造也无法正常工作。

我在其他几个类中也需要这种行为,而我不想明确地专门化每个类!谁知道我该怎么做才能解决此问题?

在此先感谢您的帮助!

詹卢卡

@ Jarod42

谢谢您的建议,但我发现了另一个我认为很确定的选择:我is_scalar<Type>在命名空间中找到了一个实现std::__1现在我的代码读取

template < class Type, bool _is_scalar = std::__1::is_scalar<Type>::value > struct is_scalar;

template < class Type >
struct is_scalar<Type, true> : true_type {
    using Scalar = Type;
};

template < class Type >
struct is_scalar<Type, false> : false_type {
    using Scalar = typename Type::Scalar;
};

而且我能够正确区分内置类型和特征类型!不管怎样,谢谢你!

编辑:

通过查看std::__1::is_scalarI的源代码,我还注意到,此解决方案可以代表任何类型的容器对象,只要它提供的类型Scalar

  • 算术类型OR
  • 成员指针或
  • 指针或
  • 空指针或
  • 枚举常数

我对么?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查类中泛型类型是否为特定类型

来自分类Dev

如何检查类型是否为类?

来自分类常见问题

检查类是否为通用类型

来自分类Dev

检查传递的参数是否为类的类型

来自分类Dev

检查泛型参数类型是否从某个类X派生

来自分类Dev

如何检查Swift泛型类型是否为Void?

来自分类Dev

如何检查Func <...>类型的变量是否为特定的类方法

来自分类Dev

如何检查类型是否为自定义类

来自分类Dev

检查类型是否为地图

来自分类Dev

检查类型是否为列表

来自分类Dev

如何在 Roslyn 中检查方法参数类型/返回类型是否为泛型?

来自分类Dev

是否可以编写genericFunction <'T>,其中将'T约束为'T2 *'T3类型的元组?

来自分类Dev

如何判断两个模板类是否为同一类型

来自分类Dev

为类类型指定泛型

来自分类Dev

为类类型指定泛型

来自分类Dev

Scala:检查两个变量是否属于同一类型

来自分类Dev

算法 - 检查给定单词是否存在单一类型

来自分类Dev

检查类型是否为Show in Haskell的实例?

来自分类Dev

检查类型参数是否为特定接口

来自分类Dev

如何检查类型是否为未签名?

来自分类Dev

如何检查T是否为聚合类型?

来自分类Dev

如何检查变量类型是否为DateTime

来自分类Dev

检查数字是否为整数类型

来自分类Dev

检查属性是否为布尔类型

来自分类Dev

检查List的属性是否为给定类型

来自分类Dev

转到:检查值的类型是否为函数

来自分类Dev

检查类型是否为列表,返回false

来自分类Dev

检查变量是否为“异步函数”类型

来自分类Dev

FSharp检查是否为元组类型