特征值:使用unaryExpr返回指针

时间:2019-04-15 07:06:28

标签: c++11 eigen eigen3

我有一个包含指向第二个结构的指针的结构,并且我试图使用unaryExpr返回该指针。但是它会不断删除指针,并给出有关混合数字类型的错误。

可复制的示例:

#include <Eigen/Core>

struct s1 {
    double d_;
};

struct s2 {
    s1* struc_;
};

int main() {
    s1 a;
    a.d_ = 1.0;

    s2 a_ptr;
    a_ptr.struc_ = &a;

    Eigen::Matrix<s2,1,1> in(1,1);
    in(0,0) = a_ptr;
    Eigen::Matrix<s1*,1,1> out(1,1);

    //Compiles
    out(0,0) = in(0,0).struc_;

    //Doesn't compile
    out = in.unaryExpr([](s2 x) { return x.struc_; });
}

Also here in compiler explorer

1 个答案:

答案 0 :(得分:1)

问题出在Eigen定义result_of的方式上:

#if EIGEN_HAS_STD_RESULT_OF
template<typename T> struct result_of {
  typedef typename std::result_of<T>::type type1;
  typedef typename remove_all<type1>::type type;
};
#else
//...

其中remove_all删除该类型的指针。我将检查更改此设置是否会破坏其他功能,但是将指针放到矩阵中并不是它们真正设计的目的。

您可以通过将指针包装到琐碎的指针包装器中来解决此问题:

template<class X> 
struct Ptr {
    X* ptr;
    operator X*() const {return ptr;}
    X& operator*() const {return *ptr;}
    X* operator->() const {return ptr;}
    Ptr(X* p = 0) : ptr(p) {}
    Ptr& operator=(X* p) {ptr = p; return *this;}
};

,然后将每个s1*替换为Ptr<s1>https://godbolt.org/z/b_EtDw