如何获得一个指向Eigen运算符的函数指针()

时间:2012-02-09 09:34:31

标签: c++ operator-overloading function-pointers member-function-pointers eigen

我想有一个指向Eigen矩阵的operator()函数的函数指针。特别是,operator()Eigen的VectorXi矩阵类,它采用单个索引。即我打电话时正在使用的运营商:

VectorXi V(1);
...
VectorXi::Index i = 0;
VectorXi::Scalar& vi = V(i); // <-- this one

我尝试的是:

VectorXi::Scalar& (*value_at_i)(VectorXi::Index i ) = &VectorXi::operator();

但这给了我很长的错误:

...: error: no matches converting function ‘operator()’ to type ‘int& (*)(Eigen::DenseIndex)’
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:124: error: candidates are: typename Eigen::internal::conditional<(bool)((Eigen::internal::traits<T>::Flags & Eigen::LvalueBit)), const typename Eigen::internal::traits<T>::Scalar&, typename Eigen::internal::conditional<Eigen::internal::is_arithmetic<typename Eigen::internal::traits<T>::Scalar>::value, typename Eigen::internal::traits<T>::Scalar, const typename Eigen::internal::traits<T>::Scalar>::type>::type Eigen::DenseCoeffsBase<Derived, 0>::operator()(typename Eigen::internal::traits<T>::Index, typename Eigen::internal::traits<T>::Index) const [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:184: error:                 typename Eigen::internal::conditional<(bool)((Eigen::internal::traits<T>::Flags & Eigen::LvalueBit)), const typename Eigen::internal::traits<T>::Scalar&, typename Eigen::internal::conditional<Eigen::internal::is_arithmetic<typename Eigen::internal::traits<T>::Scalar>::value, typename Eigen::internal::traits<T>::Scalar, const typename Eigen::internal::traits<T>::Scalar>::type>::type Eigen::DenseCoeffsBase<Derived, 0>::operator()(typename Eigen::internal::traits<T>::Index) const [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:405: error:                 typename Eigen::internal::traits<T>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(typename Eigen::internal::traits<T>::Index) [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]
/usr/local/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:347: error:                 typename Eigen::internal::traits<T>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(typename Eigen::internal::traits<T>::Index, typename Eigen::internal::traits<T>::Index) [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]

获取指向此运算符的函数指针的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

您无法创建指向成员函数的函数指针。 C ++支持指向成员函数的指针,但它可能不是你想要的。惯例是传递函子而不是函数。仿函数是一个实现了operator()的类。这正是你班上所拥有的,所以只需将原始类作为函子传递。

编辑:下面是在类T的()运算符上指向C ++中成员函数的指针的示例。

void (T::*op)(int) = &T::operator();
T t;
(t.*op)(5);

答案 1 :(得分:1)

只是为了让它更明确一点,因为我很好奇......按照rasmus的回答,我尝试了以下代码,然后编译并执行你想要的内容。

VectorXi T(5); T << 2,1,0,2,1; 
VectorXi IM(4); IM << 10,20,30,40; 
// IM maps 0 to 10, 1 to 20, 2 to 30 and 3 to 40

VectorXi::Scalar& (VectorXi::*get_value)(VectorXi::Index) = &VectorXi::operator();
VectorXi res = T.unaryExpr(bind1st(mem_fun(get_value), &IM));
// res is now 30, 20, 10, 30, 20

答案 2 :(得分:-1)

解决方案是指出正确的过载。您所看到的是重载决策失败。有4个候选人,没有一个符合value_at_i的签名。

你当然想要Eigen::internal::traits<T>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(typename Eigen::internal::traits<T>::Index) [with Derived = Eigen::Matrix<int, -0x00000000000000001, 1, 0, -0x00000000000000001, 1>]

这是一个令人讨厌的签名。但请注意,有三个重要部分:

  • 返回类型Eigen::internal::traits<T>::Scalar&
  • 班级类型Eigen::DenseCoeffsBase<Derived, 1>
  • 参数类型Eigen::internal::traits<T>::Index

在这种情况下,过载选择的相关规则非常具体:“所选择的函数是相同的函数,与上下文中所需的目标类型的函数类型相同。”没有做任何调整,甚至有一个说明(13.4 / 7)显示了这一点。

因此,我目前的假设是问题在于类型Eigen::DenseCoeffsBase<Derived, 1>,而不是VectorXi。另外两种类型是typedef,它们不会引入新类型。

相关问题