のない私はC++11 variable number of arguments, same specific typeに似た何かをしようとしているが、私は自分のタイプがあります:オーバーロード可変個の引数、同じ特定の種類のマクロまたは初期化子リスト
の束とstruct Foo
{
Foo(int) {}
Foo(int, int) {}
};
を
void f() {}
void f(const Foo&) {}
void f(const Foo&, const Foo&) {}
// etc. ... as many f() overloads as needed ...
は、希望どおりに動作します。f(); f(1); f(1, 2); f(1, { 2, 3 });
。
代わりのオーバーロード、私はまた、{}
構文(hereが示唆したように)でstd::initializer_list<>
を使用することができます。
void g_(std::initializer_list<Foo>) {}
g_({}); g_({ 1 }); g_({ 1, 2 }); g_({ 1, { 2, 3 } });
それは{}
の余分なセットを(ええ、それだけで2つの文字です)があります。 ...
#define g(...) g_({__VA_ARGS__})
g(); g(1); g(1, 2); g(1,{ 2, 3 });
(正確に理由はレガシーまたは生成されたコードで必要になることがありますf()
の構文をマッチングし、IT関連はarguably -JUST「良く見える」:正確にf()
の構文を一致させるために、マクロを使用します。 )
しかし、私は可変長テンプレート作業
void h() { }
template<typename... T>
void h(const Foo&, T...) { }
h()
、h(1)
とh(1, 2)
作品を作るための方法を見つけることはできませんが、h(1, {2, 3})
はに失敗しましたコンパイラはの型をできるだけ正確に把握することができないため、コンパイルできません。f()
とg_()
でコンパイルできます。
f()
を複数の過負荷なしで動作させる方法はありますか?またはg()
はマクロなしで動作しますか?あなたがFoo
Sの束をしたい、とあなたはブレース-INIT-リストを許可したい場合は、あなたがすべき、g()
は非常に近い(一つだけの機能と鋳型なしマジック)ですが、そのマクロがあります...
「複数の」過負荷にはどこに線を描いていますか? 2つのOKを持っているのですか? Variadicsはしばしば少なくとも2つ(再帰ケースと基底ケース)が必要な再帰に関連付けられています –
@BenVoigt "unlimited";マクロのためでなければ、 'g()'が私の好みの解決策になります。 –
'{2,3}'には型がないので、テンプレートの控除で推論することはできません。 – Jarod42