0

Aメンバー変数を持つクラスがありますvector<B>DoToAll(funcPtr)すべてのベクトルを反復処理して関数を適用するという名前の関数テンプレートを定義したいと考えています。

class A 
{
vector<B> v;
template <?????>
void DoToAll(f);
loop on v and apply the member function f;
}

class B{
void f1();
void f2();
.
.
.
}

どうやって書くのDoToAll

4

2 に答える 2

4

引数は関数ポインタでなければならないと主張しますか? そうでなければ、それはただの可能性があります

template <class F>
void DoToAll(F f) {
  std::for_each(v.begin(), v.end(), f);
}

それはすべてのfセントで機能します。はベクトルの要素であり、有効ですf(x)xつまり、 や などの関数ポインタとファンクタは問題std::functionありstd::bindません。残念ながら、メンバー関数ポインターは ではなく で呼び出すため、含まれていませx->*f()f()。しかし、メンバー関数ポインターを、呼び出しを正しく転送するファンクターにラップすることで、これも克服できます。標準ではすでにそのようなアダプターが提供されています。適切なものはmem_fun_ref_t. DoToAll関数ポインターを取るオーバーロードを追加できます。

template <class This, class Ret>
void DoToAll(Ret (*This::f)()) {
  std::for_each(v.begin(), v.end(), std::mem_fun_ref(f));
}
于 2012-06-12T21:58:46.913 に答える
0

ここで関数のみを使用する場合、テンプレートはまったく必要ありません。

void DoToAll(void (*f)(B&)) { /*...*/ }

だから、あなたはこのようなものを書くことができます

void Change(const B& what)
{
    what.ChangeSomething();
}
//...
a.DoToAll(Change) // or a.DoToAll(&Change)
于 2012-06-12T23:46:01.457 に答える