2017-03-16 8 views
3

私の実行機能をと呼びますか?パラメータパックに含まれるすべての基本クラスの関数を呼び出しますか?標準のC++ファシリティ/ライブラリを使用するか、独自のテンプレートメタプログラミングを使用しますか? C++ 11が優先されましたが、それ以降の標準にも興味があります。パラメータパック展開のすべての基本クラスで関数を呼び出すことはできますか?

コードは最も基本的な例に簡略化されています。もともと私はこれにユースケースを持っていましたが、今では私の理解を向上させるためにできるのであれば、ほとんど興味があります。

template <class ...Bases> class Test : public Bases... 
{ 
public: 
    void run() 
    { 
     // QUESTION: I want to call the run function of ALL the bases, 
     //   Is there a way to do this that compiles and works? 
     Bases.run()...; 
    } 
}; 

class One 
{ 
public: 
    void run() {} 
}; 

class Two 
{ 
public: 
    void run() {} 
}; 

int main() 
{ 
    Test<One, Two> test; 
    test.run(); 
} 

答えて

3

これは通常のパック展開です。彼らがあなたの基本クラスであるという事実は、あまり干渉しません。

C++ 11:

int _[]{0, (void(Bases::run()), 0)...}; 
(void) _; 

C++ 17:

(void)(Bases::run(), ...); 
+0

うわ、構文....特別にC++ 11 1 :) 私はそれがなく、どのように動作するかを理解しますその正確な構文を考えたことはありません。ありがとう! – jcoder

+0

@jcoderこれは、C++ 11の任意のパック展開のためのデフォルトボイラープレートです。醜いですが、頑丈です。ありがたいことにC++の17倍の式が今のところ^^ – Quentin

+0

C++ 11の構文では、最初の行の意味を理解できます。つまり、int配列を初期化し、その初期化の一環として基本クラスのメソッドを呼び出します。しかし、2行目の意味は何ですか? –

関連する問題