我有一个包含指向第二个结构的指针的结构,并且我试图使用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_; });
}
答案 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