コンストラクターで可変長引数がある場合は少々面倒です。
その場合一つ一つ定義するか可変長のままガイドを宣言する感じになるかと思います。
例えば以下のようなコードを見ると良いでしょう。
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