2017-02-13 4 views
1

コールメソッドではリスナー/コールバッククラスをトリングしていますが、私はget Declaration type contains unexpanded parameter pack 'Args'です。私のように呼び出したい : listeners.call (&ListenerType::myCallbackMethod, arg1, arg2, etc);宣言型に拡張されていないパラメータパック 'Args'が含まれています

[OK]を、私は引数の数が異なる多くのコール・メソッドを作成することができますが、私は1つの方法だけを行うことができます場合は、任意の提案

template <typename ...Args> 
void call (void (ListenerClass::*callbackFunction) (Args), Args && ...value) // Compiler error: Declaration type contains unexpanded parameter pack 'Args' 
{ 
    auto iter = listeners.begin(); 
    while (iter != listeners.end()) 
    { 
     if(auto p = iter->lock()) 
     { 
      (p->*callbackFunction) (std::forward<Args>(value)...); 
      ++iter; 
     } 
     else 
      iter = listeners.erase(iter); 
    } 
}; 

良いですか? ありがとう!

+2

これはすべてエラーメッセージです。 'Args'という拡張されていないパラメータパックを持つ宣言はどこにありますか?それを展開します。 – Barry

+0

水平スクロールバーを避けるために再フォーマットしようとしましたが、引数の名前が変更されました。これは正解を無効にします。私はロールバックしました。 –

+0

さて、あなたのデザインはひどく悪い考えです。転送参照はそのようには機能しません。 – Yakk

答えて

4

私は問題がここにあると信じています:

template <typename ...Args> 
void call (void (ListenerClass::*callbackFunction) /*here->*/(Args), Args && ...value) 

これは次のようになります。

template <typename ...Args> 
void call (void (ListenerClass::*callbackFunction) (Args...), Args && ...value) 

あなたがタイプArgsのテイクパラメータで渡している関数ポインタがパラメータであることを指定していますパック。したがって、そのパラメータパックを展開する必要があります...

+0

その場合、 'std :: forward 'の呼び出しで' Args'を展開しなければなりませんか? – Cameron

+0

'std :: forward (値)...'これは既に展開されています。これを見てください:http://stackoverflow.com/a/41071580/1865694 http://stackoverflow.com/q/41071181/1865694 –

+0

Ah 、ありがとう:-) – Cameron

関連する問題