0

特定のタスクを実行し、足し算、引き算、掛け算など、内部から簡単な計算を行うメソッドを作成したいと思います。私が間違っている場合は訂正してください。そのような操作の演算子を直接渡すことはできないようで、中間メソッドを定義する必要があります(私の例ではoperator_addと呼ばれるもののように)。私は次のコードで自分のタスクを達成しようとしています:

struct A {
  typedef int T;
  /* (...) */
  struct element {
    /* (...) */
    inline T value() const { /* something simple */ };
    element& comp_assign( const T r, T (*operation)(const T, const T) ) { // line # 40
      T res = operation( value(), r );
      return modif_aux( res );
    } /* (...) */
    inline T operator_add( const T a, const T b ) { return a + b; }
    inline element& operator+=( const T r ) { return comp_assign( r, operator_add ); } // line # 64
  };
};

しかし、次のエラーが発生します。

A.h:64: error: no matching function for call to ‘A::element::comp_assign(const int&, <unresolved overloaded function type>)’
A.h:40: note: candidates are: A::element& A::element::comp_assign(int, int (*)(int, int))
4

1 に答える 1

0

operator_addはメンバー関数であるため、通常の関数ポインタを使用して参照することはできません。静的関数またはフリー関数にするとこれが修正されますが、代わりにテンプレートを使用することをお勧めします。そうすると、呼び出し可能なオブジェクトを使用できるようになります。

template<typename Operation>
element& comp_assign( const T r, Operation operation) { // line # 40
  T res = operation( value(), r );
  return modif_aux( res );
}

inline element& operator+=( const T r ) { return comp_assign( r, std::plus<T>() ); }
于 2012-12-04T02:35:52.893 に答える