16. C++11:型推論(auto)
// std::function<void(int)> func = [](int x) { … };
auto func = [](int x) { std::cout << "x is" << x; };
func(100); // x is 100
auto b = v.begin(); // 以前は std::vector<int>::iterator b = ..
auto e = v.end();
auto f = std::find(s,e,100);
C#やJavaのvarとまあ同じ。C++はコンパイル時に型が決定さ
れる。
16
17. とある例:std::chrono
typedef int meter;
meter value = 10; // 10メートル
meter mValue = value; // おおっと、変換が必要だ
meter mValue = value * 1000; // 正しくはこう
//…「プログラミングの魔導書 Vol 1」より
よくあるバグ:
C++はこういった問題に対する解決策を持っている。
17
24. C++14:ジェネリックラムダ
(generic lambdas)
auto plus = [](auto a, auto b) { return a + b; };
C++11のラムダ式を拡張して、パラメータにテンプレートを
使用できるようにした機能
- パラメータリスト内のautoは、型をテンプレートパラメータに
するためのプレースホルダー
- template<T>書式は使用しない。
- まるでJavaScriptのようだ!
25. ジェネリックラムダ(
generic lambdas)
auto plus = [](auto a, auto b) { return a + b; };
auto result1 = plus(3, 2);
auto result2 = plus("Hello"s, "World"s);
std::cout << result1 << std::endl; // 5
std::cout << result2 << std::endl; // “HelloWold"
auto result3 = plus(1, "World"s); // ビルドエラー
// 整数型と文字列型の+演算はできない
念の為:動的に型が決定されるわけではない。コンパイル時
に決まりコードが生成される。
38. さいごに(2/2)
「言語の勉強ばっかりしても意味ない」→ もちろん正しいとおもう
「言語の勉強をしても大して意味はない」 → ではない
プログラミング言語は常に進化しており、その進化は、システム開発における
設計、アーキテクチャ、あるいはハードウェアの進化に寄り添っている。もし
くは、それらをリードする場合すらある。つまり、本気でシステム開発にコミ
ットし学習を続けている技術者は、自然といくつかの言語に詳しくなる。ある
いは、言語の学習を通してシステム開発に求められる概念を理解することもあ
る。
結局、言語の勉強をするなら、表面的なシンタックスだけの理解では不足であり、
その裏側にある意味論(セマンティクス)を理解しなければ意味がない。逆に、セ
マンティクスの理解なくして真の理解はない。というわで、皆さん安心して勉強し
てください(笑)。とはいえ、「We need good programmers far more than we
need yet-another language lawyer.」(Bjarne Stroustrup):「欲しいのは良いプログラ
マであって、言語ヲタクではない」
38