2

我想要一个指向特征矩阵的 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>]

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

4

3 回答 3

2

您不能创建指向成员函数的函数指针。C++ 支持指向成员函数的指针,但它可能不是您想要的。约定是传递函子而不是函数。仿函数是一个实现了操作符 () 的类。这正是您在课堂上所拥有的,因此只需将原始类作为函子传递即可。

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

void (T::*op)(int) = &T::operator();
T t;
(t.*op)(5);
于 2012-02-09T10:40:06.927 回答
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
于 2012-02-10T16:59:15.977 回答
-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,不引入新类型。

于 2012-02-09T14:30:45.527 回答