boost :: recursive_variant接受地图,但拒绝unordered_map

小威胁

您能否解释一下此构造为何起作用:

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?

Live On Coliru

#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章