第331章 可変長引数はどうなるか?

コンストラクターで可変長引数がある場合は少々面倒です。

その場合一つ一つ定義するか可変長のままガイドを宣言する感じになるかと思います。

例えば以下のようなコードを見ると良いでしょう。

  1 template<class T>
  2 struct Foo
  3 {
  4   Foo(...){}
  5 };
  6
  7 #if __cplusplus >= 201703L
  8 Foo(...) -> Foo<int>;
  9 #endif
 10
 11 int main()
 12 {
 13 #if __cplusplus >= 201703L
 14   Foo a = {1}; //Foo(T)
 15   Foo b = {1,2,"abc"}; //Foo(...)
 16   Foo c = Foo(1,2); //Foo(T,T)
 17 #else
 18   Foo<int> a = {1};
 19   Foo<int> b = {1,2,"abc"};
 20   Foo<int> c = Foo<int>(1,2);
 21 #endif
 22 }

ガイドが無い場合の以前のテンプレートだと以下のようになります。

 18   Foo<int> a = {1};
 19   Foo<int> b = {1,2,"abc"};
 20   Foo<int> c = Foo<int>(1,2);

ガイドありだとテンプレート引数の指定を避けることができます。

 14   Foo a = {1}; //Foo(T)
 15   Foo b = {1,2,"abc"}; //Foo(...)
 16   Foo c = Foo(1,2); //Foo(T,T)

ガイドについては一行です。

 14 Foo(...) -> Foo<int>;

これだけでテンプレート引数を省略できるから便利… (・∀・)

まあでもわかりにくいそうですけどね… (´・ω・`)

Copyright 2017-2018, by Masaki Komatsu