本征:使用 unaryExpr 返回指针

Eigen: Returning pointer with unaryExpr

我有一个包含指向第二个结构的指针的结构,我正在尝试使用 unaryExpr 来 return 该指针。但是它一直在删除指针并给出关于混合数字类型的错误。

可重现的例子:

#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

问题出在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