2

Eigen行列のoperator()関数への関数ポインタを持っていたいと思います。特に、operator()EigenのVectorXi行列クラスは、単一のインデックスをとります。私。私が試したことはあるEigen operator()への関数ポインタを得るには

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>] 

は何をこの演算子への関数ポインタを取得する正しい方法は?

+0

なぜ好きではないのですか? – cmannett85

+0

私はints Tの行列を持っています。そして、 "map"ベクトルIMは、Tに現れるかもしれない値をとり、それを新しい値に写像します。 T内のすべての値をIMを介して1つのライナーでマップしたいと思います。次のようなもの:T.unaryExpr(ptr_fun(bind1st(mem_fun(get_value、&IM))))); –

+0

シンプルな解法はもちろん、単純なラッパー 'VectorXi :: Scalar&value_at_i(VectorXi const&v、VectorXi :: Index i){return v(i);}です。 } ' – MSalters

答えて

1

私は好奇心が強いので、もう少し明示するように...ラスマスの答えに続いて、私は次のコードを試してコンパイルし、あなたが望むようにしています。

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

メンバ関数への関数ポインタを作成することはできません。 C++は、メンバー関数へのポインタをサポートしていますが、おそらくあなたが望むものではありません。規約は関数の代わりに関数を渡すことです。ファンクタはoperator()を実装したクラスです。これはまさにクラスでのものなので、元のクラスをファンクタとして渡すだけです。

EDIT:以下の溶液が正しい過負荷を示すことであるクラスT.

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

"C++は、メンバー関数へのポインタをサポートしていますが、おそらくあなたが望むものではありません。私はこれが私が望むものだと思う。それは上記のためにそれを得ることは可能ですか? –

+0

編集した回答を見てください。 – rasmus

+0

-1。 PMFは確かに質問の意図です。問題の問題は、過負荷解決に失敗したことです。これは、標準のパラ13.4で扱われています。 – MSalters

-1

の()オペレータにC++のメンバ関数へのポインタの一例です。あなたが見ているのは、過負荷の解決に失敗したことです。 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ではありません。他の2つの型はtypedefであり、新しい型を導入しません。

+0

しかし、その署名を元の投稿のようにキャスト/割り当てに変換するにはどうすればよいですか? –

+0

キャストは必要ありません。通常のオーバーロードの解像度です。しかし、過負荷解決が正しく機能するように型を正しく指定する必要があります。私は 'T'をコンパイラの出力には見ないので、少し推測ですが、' VectorXi :: Scalar&(VectorXi :: * value_at_i)(VectorXi :: Index i)=&VectorXi :: operator ); ' – MSalters

関連する問題