1

私が抱えている問題は、テンプレート化されたクラス内のカスタム比較関数で STL の並べ替えを使用したいということです。

typedef を使用することからのアイデアは、別のStackoverflow 投稿から来ました

とにかく、ここにコードがあります:

template <typename R,typename S>
class mesh{
  /* some stuff */

  void sortData(){
    typedef bool (*comparer_t)(const S,const S);
    comparer_t cmp = &mesh::compareEdgesFromIndex;
    sort(indx,indx+sides*eSize,cmp);
  }

  /* more stuff */

  // eData and cIndx are member variables
  bool compareEdgesFromIndex(const S a,const S b){
    return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]); 
  }
};

私が得ているエラーは

mesh.h:130:29: error: cannot convert ‘bool (mesh<float, unsigned int>::*)(unsigned int, unsigned int)’ to ‘comparer_t {aka\
bool (*)(unsigned int, unsigned int)}’ in initialization

前もって感謝します!

4

5 に答える 5

5

関数ポインターが必要な場所にmember-function-pointerを混在させようとしています。述語を関数としてリファクタリングするか、バインディングを使用してmember-function-pointerをクラスのインスタンスに関連付けることができます。staticmesh

インスタンスをmember-function-pointerにバインドするには、次のようにします。

std::bind( mesh_instance, &mesh::compareEdgesFromIndex, _1, _2 )

C++11で作業している場合。贅沢がない場合は、Booststd::bindの同等の機能を使用できます(で置き換えboost::bindます)。C ++ 03はいくつかのバインディング機能を提供しますが、制限があり、汎用のバインディング機能が利用できるようになったため、廃止されたと思います。

于 2012-06-04T18:13:13.010 に答える
3

compareEdgesFromIndex静的として宣言する必要があります。

static bool compareEdgesFromIndex(const S a,const S b){
  return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]); 
}

仮定compareEdgesも静的です。それ以外の場合は、メンバー関数ポインターがあり、meshポインターを呼び出す必要があります。

于 2012-06-04T18:08:34.317 に答える
3

または、compareEdgesFromIndex を非静的メンバー関数として使用する場合は、コンパレーターとして渡すことができますboost::bind(this, &mesh::compareEdgesFromIndex, _1, _2)

于 2012-06-04T18:16:39.600 に答える
1

メンバー関数は関数ではありません。これは、機能するためには、操作対象のオブジェクトインスタンスがどれであるかを知る必要があるためです。静的メンバーは、基本的には、おかしな名前とクラスのプライベート部分へのアクセス許可を持つ通常のグローバル関数です。

実際、非静的メンバー関数へのポインターは、単に呼び出すことができるものではなく、呼び出すことができるものを取得するためのオブジェクトインスタンスを提供できるものです。

代わりに、 2つのインデックスを指定して目的の結果を返すを実装するクラスstd::sortオブジェクトインスタンスを渡すことができます。::operator()(int, int)残念ながら、C ++で理解できなかった理由により、ローカルクラスはテンプレートで使用できないため、このオブジェクトクラスは非ローカルクラスである必要があります(別のクラス内で定義されたクラスである可能性がありますが、関数またはメソッド内で定義されたクラスではありません)。

于 2012-06-04T18:14:03.230 に答える
0

の代わりにstd::bind、ラムダを使用することもできます。これは、 の構文を思い出せないためstd::bindです。

auto cmp = [&mesh_instance](unsigned lhs, unsigned rhs) {
    return mesh_instance.compareEdgesFromIndex(lhs, rhs);
};
于 2012-06-04T18:41:16.867 に答える