2

メソッドのコールバックに C++11 テンプレート エイリアスを使用することは可能ですか?

入力パラメーターの 1 つとしてメソッド コールバックを受け取るテンプレート化されたメソッドがあります。

class Foo {
  public:
    template <typename OtherClass, typename T>
    void Bar(void (OtherClass::*callback)(T *));
};

実装のいくつかの場所で同じ型を使用するため、型を使用するように Bar() プロトタイプを書き直せるようにしたいと考えています。以下の新しい C++11 エイリアスを使用してみましたが、うまくいきませんでした。

class Foo {
  public:
     // This does not work
     template <typename OtherClass, typename T>
     using Callback = void (OtherClass::*)(T *object);

     void Bar(Callback callback);
};

私は何が欠けていますか?私のお気に入りの C++11 リファレンス Web サイトのいくつかで、これがどのように機能するかの例を見つけることができませんでした。

4

3 に答える 3

6

そのようには機能しません。これ:

template <typename OtherClass, typename T>
using Callback = void (OtherClass::*)(T *object);

エイリアス テンプレートを宣言しています。つまり、型を取得するにはインスタンス化する必要があります。 Callback例えば:

Callback<C, int>

次のように解決されます。

void (C::*)(int*)

したがって、メンバーは次のように宣言する必要があります。

template<typename OC, typename T>
void Bar(Callback<OC, T> callback); 
于 2013-06-15T19:53:18.273 に答える
2

テンプレート パラメータを含める必要があります。

template <typename U, typename T>
void Bar(Callback<U, T> callback);
于 2013-06-15T19:53:14.277 に答える
2

私はそれを考え出した。Bar() メソッドもテンプレート化する必要があります。

これは機能します:

class Foo {
  public:
     template <typename OtherClass, typename T>
     using Callback = void (OtherClass::*)(T *object);

     template <typename OtherClass, typename T>
     void Bar(Callback<OtherClass, T> callback);
};
于 2013-06-15T19:53:52.003 に答える