我想要一个变体包含其类型对象的副本。不知怎的,它不起作用:
struct value
{
};
class json;
using json = ::boost::variant<
::std::vector<::std::unique_ptr<json> >,
::std::unordered_map<::std::string, ::std::unique_ptr<json> >,
value
>;
json.hpp:116:2: error: conflicting declaration 'using json = '
>;
^
json.hpp:110:7: error: 'class json' has a previous declaration as 'class json'
class json;
我已经知道有2个变通办法:::std::unique_ptr<void>
,有自定义删除工具,以及使用::boost::any
代替变体的可能性,但这些是唯一的方法吗? ::boost::any
的问题是我需要启用RTTI
才能使其正常工作。
答案 0 :(得分:1)
怎么样:
struct json : ::boost::variant<
::std::vector<::std::unique_ptr<json> >,
::std::unordered_map<::std::string, ::std::unique_ptr<json> >,
value
>
{
using variant::variant;
template <typename U>
json& operator=(U&& u)
{
variant::operator=(::std::forward<U>(u));
return *this;
}
};
这将是解决方案,除非它对g ++不起作用(由于构造函数调用模糊,构造出矢量的json失败)。从 const引用到这样的向量的构造起作用,但不是非const引用。我不知道为什么。此外,unique_ptr
对我不起作用boost::variant
,因为它不可复制(shared_ptr
确实有效)。