C++をそれなりに読めるようになるためのHelloWorld集　①IOStreamとラムダ式

# C++をそれなりに読めるようになるために
全くC++のコードを書いていない。
書いていないものはふつう読めないので、C++のコードは読めない。

そんな僕だが、[WebAssemblyに興味をもった](http://qiita.com/kmry2045/items/0499575bc64e49c9f998)ため、主要な記述言語となるだろうC++をそれなりに読めるようになっておこうと思い立った。

思い立ったは良いが、C++はhelloworldからしてなんかとっつくにくい。
こんなの:
>  std::cout << "Hello World" << std::endl; 

これをひもとくうちに、C++でいろいろなHello Worldを次々と書いていけば、
C++のコードがそれなりに読めるようになるのではと思ったため、
C++でいろいろなHello Worldを書いてみる。

由緒あるC++にはいろいろなバージョンがある。
C++強者のサイトを眺めてまわると、C++の言語機能をそれなりに網羅するためには、
数百はHello Worldしなければならないのでは、との気になってくる(よく分かってないので、気になっているだけ)。初心者なので、記述に誤りを見つけた方はご指摘くださいませ。

ということで、今回は第一回目として
C++のIOStreamとラムダ式でHello Worldしてみる。


# IOStreamでHelloWorld
IOStreamは、C++のHelloWorldの一番の基本であるようだ。

[C++0x基礎文法最速マスター](http://faithandbrave.hateblo.jp/entry/20100201/1264997004)さんでも他のマスター系サイトでも、IOStreamが使われている。
詳細は、C++0x基礎文法最速マスターさんにおまかせするとして、自分なりに、 IOStreamでHelloWorldを読み解いてみる。

[コード]

```hello_iostream.cpp
#include <iostream> //①
using namespace std; //②
int main(){
	   cout << "Hello World." << endl; //③
	   return 0;
}

```
>読み解き:
①、②iostreamをstd（スタンダードライブラリ）のnamespace下で使うための宣言
③　std::cout(console outの略称)をnamespace std下ではcoutと書く。
　coutは、"Hello World."とendl(改行コード)とを順にストリームとして受け取る。

[処理結果]

```
$ g++ hello_iostream.cpp 
$ ./a.out
Hello World.
```
[参考リンク]

- [C++のHello World](http://kaworu.jpn.org/cpp/C%2B%2B%E3%81%AEHello_World)
- [C++を知りたい(1) コンパイル](http://blog.starbug1.com/archives/504)

ふだん、RubyやPythonのようなスクリプト言語を使っている人には、一番の基本もけっこう骨があるね。
ちなみにmain関数は必ずint型らしい。

#C++14のラムダ式でHelloWorld
モダンな言語の条件の一つがラムダ式を簡潔に書けること。
長い歴史を持つC++の場合、直近のC++14になってようやくにラムダ式を簡潔に書けるようになったとのこと。
ということで、ちょっと無理して、ラムダ式でのHelloWorldに挑戦しておきたい。

見よう見まねで、以下のコードを書いた。
参考　

[コード]

```hello_lambda.cpp
#include <iostream>
using namespace std;

//for C++14

auto echo = [] //①
    (string s) { cout << s << endl; }; //②

int main() 
{   
    echo ("Hello C++14 World /w lambda []."); //③
    return 0;
}	    


```
>読み解き:
① auto型で型変換してくれるラムダ式をechoという名で定義する。[]のところがラムダ式宣言なのだろう。
③ ラムダ式は、std::string型のsを入力に標準出力にsを出力する。
③ ラムダ式の呼び出しは普通の関数呼び出しと同様に(も)行える。

ということで、自己満足目的のC++14でのラムダ式Hello Worldは記述終了。
※ラムダ式の書き方は多言語の類推で、なんとなく決めてみた(より良い流儀がたぶんあることだろう)。

初心者らしい感想としては、C言語とは違い、C++の文字列の扱いは気楽なのね、ということ(普通にstring型が使える)。

[ビルド]
問題はC+14のビルドだ。
（予想通り）初心者がC++14でコンパイルできるようになるには結構手間取ってしまった。
今回のC++学習は、家と職場の両方で気軽に試せるよう、ブラウザ上のubuntu環境(cloud9)で進めていく予定。ディフォルトではgccのバージョンが若干古くC+11までの対応なので、C++14には、swiftのインストールついでにインストールされるclangで挑戦することとした。

いくつかのサイトをさまよって最終的には、以下のコマンドでビルドできた。
> $ clang++ -stdlib=libc++ -std=c++1y hello_lambda.cpp 

clangのバージョンは、3.4-1。以降のバージョンではオプション指定が異なるらしい。
> $ clang++ -v
>Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu

今後も、いろいろなオプション追加などがありうるだろうから、ここでやっつけのMakefileを作成

```Makefile
OPT=-stdlib=libc++ -std=c++1y
CL = clang++ ${OPT}

run: hello_lambda.cpp
	./a.out
hello_lambda.cpp:
	$(CL) -c $@
```

[処理結果]

```
 $ make
./a.out
Hello C++14 World /w lambda [].

```
[参考リンク]

-　[C++14 のラムダ式 完全解説 前編](http://d.hatena.ne.jp/gintenlabo/20130516/1368711542) 
- [Cloud9では、gccとvimも使おう。](http://qiita.com/kmry2045/items/c3402ffdcb69ac9b1f9d)
※cloud9上での設定済環境のキャプチャ画面を貼っておく。無償で安定したブラウザ上のgcc&clang環境となっている。

![c9_clang.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/3366ad28-9cd7-baa9-4de6-0221d399589c.png)

#所感
C+14のラムダ式、けっこうかわいい。
次回はテンプレート使ってのHello Worldに挑戦したい。