3

いくつか検索しましたが、この質問に対する答えが見つかりませんでした。再投稿した場合はお詫びします。さまざまなオブジェクトの束で同じ引数で同じ関数を呼び出したいです。現在、次のように実装しています。

void callWithArg(const char* msg) { }

template <typename HEAD, typename.... TAIL>
void callWithArg(HEAD&& head, TAIL&&... tail, const char* msg) {
    head.foo(msg);
    callWithArg(tail..., msg);
}

明らかに、それ自体は特に面倒なコードではありません。この種の再帰呼び出しよりも、そのパラメーター パックを反復処理する簡単でクリーンな方法があるかどうか疑問に思っていました。ありがとう!

4

1 に答える 1

0

これを表現するために私が知っている最も簡潔な方法は次のとおりです。

template<typename ...T>
void callWithArg(const char *msg, T &&...t) {
  int dummy[] = { 0, (t.foo(msg), 0)... };
}

パック展開はint、配列を初期化するために使用されるtype の式のリストに展開されますdummy(これは破棄します)。fooC++11 ではリスト初期化の要素が左から右に配列されるため、の呼び出しは配列されます。

を追加する#include <initializer_list>と、これを次のように少し簡略化できます。

auto dummy = { 0, (t.foo(msg), 0)... };

さまざまなコンパイラがこのコードで生成する「未使用の変数」警告を抑制したい場合もあります。

(void) dummy;

0,関数に 以外の引数が指定されていない場合のエラーを回避するために、イニシャルが含まれていますmsg。また、パック内の型を推測できるように、パックを最後に配置するように関数のパラメーターを並べ替えました。

于 2013-02-15T23:42:50.987 に答える