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

boost::variant の型パラメータ数制限をオーバーした時の対処

C++ Boost

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_TYPESMPL_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::variantC++11 の variadic templates を使う実装になってほしいし,あわよくば std::variant がほしい.