2

このやや似た質問を参照しました。ただし、ここではシナリオが異なります。

struct A
{
  void foo (int i) {} // choice
  void foo (double i) {}
};

template<typename ObjType, typename FuncPtr>
void ReceiveFuncPtr (ObjType o, FuncPtr pf)
{
 (o.*pf)(1);
}

int main ()
{
  A obj;
  ReceiveFuncPtr(obj, &A::foo); // don't want typecast here
}

上記のテスト コードでは、foo内部に がオーバーロードされていAます。1 つしかなかっfooた場合、コードは正常に動作します。ただし、オーバーロードの場合、コンパイラは次のように文句を言います。

エラー: 「ReceiveFuncPtr(A&, [未解決のオーバーロードされた関数型])」の呼び出しに一致する関数がありません

を呼び出すときに明示的に型キャストする代わりに、そのパラメーターにいくつかの変更を加えて、同様のバージョンを常に受けReceiveFuncPtr()​​取ることができるようにする方法はありますか?templatefoo(int)class A

編集:関数の呼び出し中に型を気にする必要はありません。ReceiveFuncPtr(obj, &A::foo);それは次のように単純でなければなりtemplateません。

4

2 に答える 2

4

関数テンプレートは次のように記述できます。

template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int) )
{
   (o.*pf)(1);
}

この関数テンプレートは自動的に を選択しますvoid foo (int i)


私の以前の回答(他の人にとって役立つかもしれないので、削除しません)

あなたの問題:

ReceiveFuncPtr(obj, &A::foo); // don't want typecast here

あなたはこれを行うことができます:

void (A::*pFun)(int) = &A::foo; // No casting here!
ReceiveFuncPtr(obj, pFun);      // No casting here!

pFunへのポインタですvoid A::f(int)


typedef を次のように使用することもできます。

typedef void (A::*FunDouble)(double);
typedef void (A::*FunInt)(int);

FunInt pFun  = &A::foo;    // No casting here!
ReceiveFuncPtr(obj, pFun); // No casting here!
于 2011-06-17T05:06:00.513 に答える
4

これはどう:

template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int))
{
 (o.*pf)(1);
}
于 2011-06-17T05:13:44.450 に答える