C++11の機能 (scoped enum, 可変長テンプレート, usingによる型エイリアス)
C++11の機能を紹介するシリーズ第五弾です。 今回はscoped enum, 可変長テンプレート, usingによる型エイリアスについて紹介していきます。 scoped enum Cからあるenumは中で定義した名前がそのまま垂れ流しになってしまっていました。これにより、すでに使われている名前とかぶるなどの問題がありました。 また、enumは整数型への暗黙的な型変換ができましたが、scoped enumは明示的に型変換を行わない限り整数型に代入することはできません。 enum class RgbColor { Red, Green, Blue, }; // 使う RgbColor rc = RgbColor::Red; int irc = static_cast<int>(rc); 可変長テンプレート C++11より前のテンプレートはテンプレート引数を可変長にすることができませんでした。そのため、最小1から最大10の任意の個数のテンプレート引数を受け取るには10個の関数テンプレートなどを書く必要がありました。しかし、この方法では最大の個数が10に制限されてしまいますし、何よりもテンプレートで省略可能であるはずのことが全く省略できていません。 そこで、C++11では0個以上の任意の個数のテンプレート引数を受けることができる可変長テンプレートが追加されました。 例として、引数に取った値をスペース区切りで標準出力に出力するコードを以下に示します。 template<class Arg> void print(Arg arg) { std::cout<<arg<<std::endl; } template<class Arg, class... Args> void print(Arg arg, Args... args) { std::cout<<arg<<" "; print(args...); } この例で出てくるclass...が可変長テンプレートです。テンプレート引数の型(?)の部分はテンプレートで使えるものであれば何でも使えます。この例ではclassを使っていますが、intで...