您能否解释一下此构造为何起作用:
typedef boost::make_recursive_variant<
boost::blank,
std::string,
std::vector< std::string >,
std::vector< int32_t >,
std::vector< int64_t >,
std::vector< double >,
std::vector< std::complex<double> >,
std::map< std::string, boost::recursive_variant_ >
>::type Variant;
而且这不是:
typedef boost::make_recursive_variant<
boost::blank,
std::string,
std::vector< std::string >,
std::vector< int32_t >,
std::vector< int64_t >,
std::vector< double >,
std::vector< std::complex<double> >,
std::unordered_map< std::string, boost::recursive_variant_ >
>::type Variant;
不幸的是,我无法理解错误消息。它说了一些关于
static int initialize(void* dest, param_T operand)
^
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: no known conversion for argument 2 from ‘const std::unordered_map<std::__cxx11::basic_string<char>, boost::variant<boost::detail::variant::recursive_flag<boost::blank>,
//Skipped
to ‘boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<8l>,
Ubuntu 16.04,gcc 5.4.0 20160609,提升1.58。
哈哈 您随便提到SWIG的评论使我眼前闪闪发光。
对于涉及的任何事情,我都不信任SWIG boost::[make_recursive_]variant
。既然您已经提到了,对我来说99%的清楚是SWIG无法理解所涉及的包装器类型。谜团已揭开。
好处是,如果可以使用,则不需要它boost::unordered_map
。这是因为由于实现细节,std::unordered_map
在(浅)实例化时可能要求映射类型完整:如何在值类型是其所在类的情况下拥有unordered_map?。
#include <boost/variant.hpp>
#include <complex>
#include <string>
#include <vector>
#include <boost/unordered_map.hpp>
using boost::unordered_map;
struct Variant : boost::variant<
boost::blank,
std::string,
std::vector< std::string >,
std::vector< int32_t >,
std::vector< int64_t >,
std::vector< double >,
std::vector< std::complex<double> >,
unordered_map< std::string, Variant >
>
{
using base_type = boost::variant<
boost::blank,
std::string,
std::vector< std::string >,
std::vector< int32_t >,
std::vector< int64_t >,
std::vector< double >,
std::vector< std::complex<double> >,
unordered_map< std::string, Variant >
>;
using base_type::base_type;
using base_type::operator=;
};
int main() {
Variant v = unordered_map<std::string, Variant> { {"hello", Variant{"world"} } };
}
起作用的原因是因为映射是基于节点的容器:它已经使映射类型的分配与其物理布局脱钩,这是您需要递归类型包装器的主要原因。
另请参见此处,以了解更多详细说明的情况:使用带有boost变量的声明进行递归
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句