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でも可変長でintを0個以上受けることができます。
また、print関数の中にあるargs...の部分はパラメータパックの展開を行っています。パラメータパックとは可変長テンプレート引数と可変長テンプレート引数によって受けた任意個の関数の引数のことを指します。パラメータパックは0個以上のオブジェクトがまとめられた状態になっています。C++11ではパラメータパックに直接演算を施すことはできないため、上記の例のように再帰を使い処理を行っています。C++17からは畳み込み式が追加されたため直接演算を行うことができるようになりました。

usingによる型エイリアス

型エイリアスはtypedefのように型に別名をつけることができる機能です。
usingを用いて型エイリアスをするには次のように記述します。

using int_pointer = int*;
using callback_type = void(*)(int); // intを引数にとる関数ポインタ

usingではさらにテンプレートを使った型エイリアスができます。

template<class ValueT> using string_map = std::map<std::string, ValueT>;

コメント

  1. Casino Games and Gambling - Coyote Casino
    Casino Games and Gambling at Coyote Casino. 비트 코인 게임 Coyote Casino, located in Loyola, 라이브 바카라 Illinois, 버슬롯 is one of the best w88 com login entertainment options in the 블랙잭

    返信削除

コメントを投稿

このブログの人気の投稿

初めの挨拶

C++11の機能 (型推論, 範囲for)

C++11の機能 (関数のdefault・delete宣言, overrideとfinal指定子, 移譲コンストラクタ, 継承コンストラクタ)