5

考虑:

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;

这将我的类型可以容纳的类型数量的限制pow(BOOST_VARIANT_LIMIT_TYPES, L)扩展到,其中L是嵌套的级别数。

这(在某种程度上)是一个可接受的解决方案,还是只是一个糟糕的 hack?那里有更好的解决方案吗?也许老式union的更合适?

4

2 回答 2

4

从 boost 1.57 开始,可以通过创建 boost 变体boost::make_variant_over,它将类型 Sequence 作为类型参数。在模型 boost::mpl 的序列概念之前,对该类型没有类型限制。

vanilla boost::mpl::vector 类型列表最多可以使用 50 种类型。虽然如果你有一个符合 C++11 的编译器,那么创建你自己的可变参数类型列表和胶合代码并不难,这使得它成为一个 MPL序列。而且从这​​一点来看,类型的数量受到编译器允许的最大模板实例化深度的限制,通常为 256。

在这个GIST中,我使用 Dave Abraham 的类型列表并添加胶水代码,因此它模拟了 mpl 的序列概念。请注意,我还没有对几个编译器进行详尽的测试,我也只是用 boost 1.56 对其进行了测试。

于 2015-03-17T18:02:36.257 回答
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

为什么你仍然需要这么多不同类型的东西?这听起来像是一个潜在的设计问题。

于 2013-06-10T16:22:56.273 回答