繁体   English   中英

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

[英]boost::recursive_variant accepts map, but rejects 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。

该问题似乎与您的特定设置有关。 我无法使用以下所有配置进行复制。

此外,全面的抽样测试包括

Variant v = std::unordered_map<std::string, Variant> { {"hello", Variant{"world"} } };

内部主要所有也编译顺利。

具有libstdc ++的GCC




用libc ++编写的Clang



哈。 您随便提起SWIG的评论使我眼前闪闪发光。

在涉及boost::[make_recursive_]variant任何事情上,我都不相信SWIG。 现在您已经提到了,对我来说99%的清楚是SWIG无法理解所涉及的包装器类型。 谜团已揭开。

好处是, 如果可以使用boost::unordered_map不需要它。 这是因为由于实现细节, std::unordered_map可能要求在(浅)实例化时完成映射类型: 如何在值类型为其所在类的情况下拥有unordered_map?

生活在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变量的声明进行递归

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM