C++17 で関数テンプレートの型推論はかなり良くなってきたと思います。
特にラムダに関わる部分はテンプレートと auto を組み合わせるべきか個人的に迷うことがありました。
でも最新のアップデートなら、混ぜてもコードが汚染されるような感覚がなくなった気がします(気のせいかも…)。
ではコードを見ながらチェックです。
マクロについては クロスコンパイルのための組み込みマクロ を参照くださいね。
main.cpp.
1 #include <iostream>
2
3 template<class T>
4 struct Foo{
5 Foo(T t){ std::cout << t << '\n'; }
6 };
7
8 template<class T>
9 auto bar(T t)
10 {
11 #if __cplusplus >= 201703L
12 return Foo(t);
13 #else
14 return Foo<T>(t);
15 #endif
16 }
17
18 int main()
19 {
20 #if __cplusplus >= 201703L
21 bar(100);
22 [](auto a){
23 return Foo(a);
24 }(200);
25
26 #else
27 bar<int>(100);
28 [](auto a){
29 return Foo<int>(a);
30 }(200);
31
32 #endif
33 }
これをビルドして実行すると以下のような出力になります。
$ g++ main.cpp -std=c++17 $ ./a.out 100 200
まず気にしたいのは以下の箇所です。
3 template<class T>
4 struct Foo{
5 Foo(T t){ std::cout << t << '\n'; }
6 };
8 template<class T>
9 auto bar(T t)
10 {
12 return Foo(t);まあ不自然では無いですが Foo はクラステンプレートなので本来ならテンプレート引数を明示的に指定しなきゃだめなはずです。
似たような表現は他にもあります。
22 [](auto a){
23 return Foo(a);
24 }(200);これはラムダ式内ですが auto から類推されてるので、かなりハードルが高そうですよね。
そうでス。
このようにテンプレート引数の省けるのが新しい推論ってことです。
Copyright 2017-2018, by Masaki Komatsu