条件定数式による型の選択
ある定数式が真のときと偽のときで、型定義を変更したいと思ったことはないでしょうか? 例えば、ある値が 0x7f より大きいときと小さいときで、char 型か unsigned char 型かを変えたい場合などです。
条件式が前処理式であれば、#if 指令を使って条件付きコンパイルすることが可能です。しかし、条件式に sizeof 演算子が含まれていたり、メタ関数が含まれている場合には、#if 指令ではどうすることもできません。
そんなときには、条件式に応じて返す型が変わるメタ関数を使用するのが定石です。こうしたメタ関数は、自分で作っても知れています。しかし、Boost C++ Libraries に含まれるのであれば、それを使った方がよいでしょう。
この類のメタ関数は、type_traits か mpl 辺りにあるのではないかと探してみたのですが、どうも見つかりません。しかたなく、いろいろと条件を変えて grep 検索をしていると、見つけました! それは、detail の下にこっそりあったのです。
それでは、早速使い方を見てみましょう。
#include <boost/detail/select_type.hpp>
typedef boost::detail::if_true<sizeof(int)==4>
::then<int, long>::type int32_type;
typedef boost::detail::if_true<sizeof(int)==4>
::then<int, long>::type int32_type;
どのようにインデントするのがよいのか若干迷いますが、if_true の後の <...> に条件定数式を指定し、それが真であれば、then の後の <...> で指定した最初の型が、偽であれば後の型が選ばれます。
なお、この if_true を他のテンプレートの中で使うときは、
if_true<is_const<T>::value>::template then<T1, T2>::type
のように、then の直前に template を付ける必要があります。
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- Boost C++ Libraries 1.43.0をVisual Studio 2010でビルドしてみました。
- Boost Format の罠
- lexical_cast.hpp に含まれる謎の文字
- shared_ptr の排他制御を抑止する。
- ビルド済みライブラリの入手先
- ライブラリ名に関する注意事項
- 過去の情報
- Boost C++ Libraries 1.36.0をVisual Studio 2005 SP1でもビルドしてみました。
- Boost C++ Libraries 1.36.0をVisual Studio 2008 SP1でビルドしてみました。
- Boost C++ Libraries 1.37.0をVisual Studio 2008 SP1でビルドしてみました。
- Boost C++ Libraries 1.38.0をVisual Studio 2008 SP1でビルドしてみました。
- Boost C++ Libraries 1.39.0をVisual Studio 2008 SP1でビルドしてみました。
- Boost C++ Libraries 1.40.0をVisual Studio 2008 SP1でビルドしてみました。
- Boost C++ Libraries 1.41.0をVisual Studio 2008 SP1でビルドしてみました。
- Boost C++ Libraries 1.42.0をCygwinのGCC 4.3.4でビルドしてみました。
- Boost C++ Libraries 1.42.0をVisual Studio 2008 SP1でビルドしてみました。
- 条件定数式による型の選択
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- C99関数・マクロ・前処理スクリプト集
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ベターCとしてのC++
- マイコン メモ
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 象の卵を探して...
- 車輪の再発明
- 過去の情報
- Boost C++ Libraries メモ


よく考えると...
MPL の if_ や if_c で解決しますね。MPL はバージョン 1.33.x 以降ですし、1.32.x 以前のものを使う用もないので...
(Cygwin の都合で 1.33.1 を使う用事はまだあります)