boost::variant
はテンプレートに書ける型の数がデフォルトで 20 に制限されている.この値は variant_fwd.hpp に定義されている BOOST_VARIANT_LIMIT_TYPES
マクロで確認できる.
今回は制限の 20 を超える数の型を boost::variant
に指定したくなったので,その方法を調べてみた.英語の ML しか見つからなかったのでメモ.
Boost.MPL を触ったことがある人なら,BOOST_VARIANT_LIMIT_TYPES
をユーザ定義して好みの数を指定してしまえば良いのではないかと思うかもしれないけれど,BOOST_VARIANT_LIMIT_TYPES
はユーザが変更できるつくりになっていない.BOOST_VARIANT_LIMIT_TYPES
は MPL_LIMIT_LIST_SIZE
の値をみているだけで,MPL_LIMIT_LIST_SIZE
はユーザ定義可能なので,MPL_LIMIT_LIST_SIZE
を定義しておけば済むかと思ったけれど,これもうまくいかなかった.
結果的に boost::make_variant_over
メタ関数を使うことで解決した.boost::make_variant_over
は引数に取った MPL コンテナに保持されている型で boost::variant
を構築する.今回は boost::mpl::vector
を使った.boost::mpl::vector
も例に漏れずデフォルトの要素数が 20 までなので,<boost/mpl/vector/vector30.hpp>
のように要素数を拡張したヘッダをインクルードする.
#include <boost/variant/variant.hpp> #include <boost/mpl/vector/vector30.hpp> using types = boost::mpl::vector25< type1 , type2 , type3 , type4 , type5 , type6 , type7 , type8 , type9 , type10 , type11 , type12 , type13 , type14 , type15 , type16 , type17 , type18 , type19 , type20 , type21 , type22 , type23 , type24 , type25 >; typename boost::make_variant_over<types>::type v; // v には type1 〜 type25 のいずれかの型の値を入れられる.
boost::variant
,C++11 の variadic templates を使う実装になってほしいし,あわよくば std::variant
がほしい.