本征:使用 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_; });
}
问题出在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
我有一个包含指向第二个结构的指针的结构,我正在尝试使用 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_; });
}
问题出在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