読者です 読者をやめる 読者になる 読者になる

スタックを使用するmapを作りました

C++

ソース: static_map.hpp - Shand C++ Library
テスト: static_map/test.cpp - Shand C++ Library


boost::container::static_vectorをラップして、static_mapを作りました。
ローカル変数で気軽にmapを使う、というのが主な目的です。



使い方:

  • 第3テンプレート引数で、最大要素数を指定する。
  • 初期化子リストで初期化する。
  • at()メンバ関数で検索する。

以上です。簡易的な用途を想定しているので、それ以外の機能は一切持たせていません。


以下のように、対応表による変換を簡潔に書き、switch文の代わりに使うのが目的です。

#include <iostream>
#include <boost/utility/string_ref.hpp>
#include <shand/static_map.hpp>

enum class Color {
    Red,
    Green,
    Blue,
    Size // 要素数
};

std::string colorString(Color c)
{
    const shand::static_map<Color, boost::string_ref,
                            static_cast<std::size_t>(Color::Size)> map = {
        {Color::Red,   "Red"},
        {Color::Green, "Green"},
        {Color::Blue,  "Blue"}
    };
    return map.at(c).to_string();
}

int main()
{
    std::cout << colorString(Color::Red) << std::endl;
}
Red

スタックアロケータをmap用に設計すれば、std::mapの全ての機能をそっくりそのまま使えるのですが、アロケータのrebindによるステートフルアロケータの困難さ、ノードのアロケートなどによる要素数算出の難しさなどがあり、static_vectorをラップするというところに妥協しました。


修正履歴:

  • 2013/12/05 0:47 : 対応表にstd::stringを使っていたのをboost::string_refに修正。せっかくなので、対応表の処理にフリーストアを一切使わないようにした。



宣伝: 『プログラミングの魔導書 Vol.3』 予約受付中です。
http://longgate.co.jp/books/grimoire-vol3.html