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