5

重複の可能性:
可変個引数テンプレートでの宣言の使用

最近、2つの関数オブジェクトを組み合わせて、最初の2つがオーバーロードされたかのように動作する新しい関数オブジェクトを形成するための一般的なメカニズムに出会いました。

template <typename F1, typename F2>
struct overload : public F1, public F2
{
    overload(F1 f1, F2 f2) : F1(f1), F2(f2) {}

    using F1::operator();
    using F2::operator();
};

可変個引数テンプレートを使用して、このアイデアをN個の関数オブジェクトで機能するように拡張しようとしています。

template <typename... Fs>
struct overload : public Fs...
{
    overload(Fs... fs) : Fs(fs)... {}

    using Fs::operator();...
};

ただし、GCCは、using宣言で可変個引数拡張を実行しようとしたことについて不満を述べています。

test.cpp:6:24: error: parameter packs not expanded with '...':
     using Fs::operator();...
                        ^
test.cpp:6:24: note:         'Fs'
test.cpp:6:26: error: expected unqualified-id before '...' token
     using Fs::operator();...
                          ^

私は次のようないくつかのバリエーションを試しました:

using Fs::operator()...;

using Fs...::operator();

しかし、どちらもトリックを行いません。

これを行うことは可能ですか?

4

1 に答える 1

-6

「最近、一般的なメカニズムに出くわした」の代わりに、「最近、一般的なメカニズムを説明するDaveAbrahamsによるブログ投稿に出くわした」などの参照を提供してください。

ステートメントでパラメーターパックの拡張がサポートされているかどうかは疑わしいです。using標準を確認する時間がないので、申し訳ありません。質問する前にドキュメントを読むのはあなたの仕事です。

しかし、(言語の質問ではなく)目前の問題を解決する実際的な問題として、直接展開を使用する代わりに、いつでもこれを再帰的にコーディングできます。残りのファンクターを取り込むクラスから継承し、最初のファンクターを取り込むだけです。ここで、「残り」は再帰的なステップであり、ベースケースとしてファンクターの空のリストで終了します。

于 2012-10-01T01:50:15.963 に答える