考虑:
typedef boost::variant<T0, ..., TN> variant_T_t;
typedef boost::variant<U0, ..., UN> variant_U_t;
...
typedef boost::variant<variant_T_t, variant_U_t, ...> variant_t;
这会将我的类型可以容纳的limit on the number of types扩展为pow(BOOST_VARIANT_LIMIT_TYPES, L)
,其中L
是嵌套级别的数量。
这(在某种程度上)是一个可接受的解决方案,还是只是一个糟糕的黑客攻击?那里有更好的解决方案吗?也许老式的union
更合适?
答案 0 :(得分:3)
这是一个丑陋的黑客。这将使您的访问者或您的来电变得极其丑陋和难以理解。
尝试仅增加限制 - Boost.Variant将其定义为与BOOST_MPL_LIMIT_LIST_SIZE
相同,如果禁用预生成的标头(虽然在编译时遇到命中),您可以覆盖它。
http://www.boost.org/doc/libs/1_53_0/libs/mpl/doc/refmanual/limit-list-size.html
为什么你还需要这种疯狂的不同类型?这听起来像是一个潜在的设计问题。
答案 1 :(得分:2)
从boost 1.57开始,可以通过boost::make_variant_over
创建boost变体,它将Sequence类型作为类型参数。在模型boost :: mpl的 Sequence Concept之前,对该类型没有类型限制。
vanilla boost :: mpl :: vector typelist最多可以使用50种类型。 虽然如果你有一个C ++ 11兼容的编译器,那么创建你自己的可变参数类型列表和胶水代码并不是那么难,这使得它成为一个MPL 序列。从这一点来看,类型的数量受编译器允许的最大模板实例化深度的限制,通常为256。
在这个GIST中,我正在使用Dave Abraham的类型列表并添加胶水代码,因此它模拟了mpl的序列概念。请注意,我没有在几个编译器上完成测试,我也只是使用boost 1.56进行了测试。