ソース: 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 |