草庐IT

c++ - 如何制作适用于 gcc 4.6 的递归 boost::variant?

我正在解码bencode,并且有一些代码适用于gcc4.4。但是最近升级到gcc4.6后,此代码不再生成:#ifndefBENCODE_VALUETYPES_H#defineBENCODE_VALUETYPES_H#include#include#include#includenamespacebencode{typedefboost::make_recursive_variant,std::map>::typeValue;typedefstd::mapValueDictionary;typedefstd::vectorValueVector;};#endifg++给出了这个错误信息:

c++ - 如何制作简化版的 boost::variant?

我有一组更简单的要求,不需要太多变体的机制。如果可以的话,我也不想依赖boost。我需要存储编译时已知的任意类型(可能是void)。它要么是可移动构造的,要么是可复制构造的,如果其中任何一个抛出异常,则允许包含的值未定义。除了这个值,它还可以包含::std::exception_ptr或::std::error_code.::boost::variant如果T会起作用允许无效。除了::boost::variant提供我在这种情况下实际上不需要的“永不空保证”。而且,如果我理解它是如何正确工作的,它与可以移动但不能复制的类型不太兼容。现在我正在编写大量重复的代码,我不应该编写这些代码来分

c++ - 转换 std::vector 为 boost::variant 类型

我如何实现下面的函数来从Value的vector进行转换?到Container?如果不是values的所有成员,我想断言是同一类型,即如果vector包含字符串和整数的混合。这是因为函数的返回值是std::vector。或std::vector.typedefboost::variantValue;typedefboost::variant,std::vector>Container;ContainervaluesToContainer(conststd::vector&values){returnContainer();} 最佳答案

c++ - 在常量表达式中更改 union 的事件成员

玩constexpr和union我发现,我无法更改union的活跃成员在constexpr.只有一个异常(exception):union空类。constexprboolt(){structA{};structB{};unionU{Aa;Bb;}u{};u.a=A{};u.b=B{};returntrue;}static_assert(t());constexprboolf(){structA{charc;};structB{charc;};unionU{Aa;Bb;}u{};u.a=A{};u.b=B{};//errororiginatingfromherereturntrue;}s

c++ - 来自 Boost.Spirit 语法的属性:来自 std:vector of boost::variant 的错误

我有一个用于读取棋盘游戏位置描述的工作解析器(国际跳棋,officialgrammar):#include#includenamespacex3=boost::spirit::x3;autoconstcolon=x3::lit(':');autoconstcomma=x3::lit(',');autoconstdash=x3::lit('-');autoconstdot=x3::lit('.');autoconstking=x3::char_('K');autoconstcolor=x3::char_("BW");autoconstnum_sq=x3::int_;autoconstnu

c++ - 当 -std=c++17 在编译器输出中时,编译器请求通过使用 -std++17 标志为 std::variant 启用 c++17 支持

前段时间我在让std::variant在QtCreator项目中工作时遇到了问题,在这里面临类似的提示:Can'tusec++17featuresusingg++7.2inQtCreator我解决了这个问题,并且在这个项目上已经愉快地工作了一段时间,没有进一步的问题。这是在ubuntu14.04上运行的,使用GCC7.2.0构建,也在clang5.0下构建。两天前,我备份了所有内容,安装了最新的QtCreator,再次安装了我的所有工具(gcc7.2.0和clang5.0),检索了我的项目并尝试构建。构建失败,说明:/usr/include/c++/7.2.0/bits/c++17_w

c++ - 嵌套提升变体类型以增加类型限制?

考虑:typedefboost::variantvariant_T_t;typedefboost::variantvariant_U_t;...typedefboost::variantvariant_t;这扩展了limitonthenumberoftypes可以由我的类型保存为pow(BOOST_VARIANT_LIMIT_TYPES,L),其中L是嵌套的级别数。这是(在某种程度上)可接受的解决方案,还是只是一个糟糕的黑客攻击?那里有更好的解决方案吗?也许老式的union更合适? 最佳答案 从boost1.57开始,可以通过boo

C++ 相互递归变体类型

我正在尝试使用变体在C++中表示PDF对象类型。PDF对象是以下之一:BooleanIntegerRealStringNameStreamArrayMap如您所见,Object类型是相互递归的,因为Arraytype需要声明Map需要声明Array的类型类型。我怎么能在C++中表示这种类型呢?如果变体不是最好的方法,那什么才是?这是我到目前为止尝试过的方法,但由于std::unordered_map的要求,它无法编译。(我认为)http://coliru.stacked-crooked.com/a/699082582e73376e 最佳答案

c++ - operator<< with boost::variant 是如何实现的

我明白boost::variant是这样实现的templatestructvariant{std::aligned_union::typebuffer;....};我们如何制作operator对于像这样的结构,打印缓冲区中存储的类型并将其传递给operator对于cout?为此,我们需要知道存储在缓冲区中的元素的类型,对吧?有没有办法知道这一点?此外,我正在寻找对此类实现的解释(如果存在的话)。不仅仅是它的存在以及我如何使用它。 最佳答案 Boost有一个apply_visitor函数,它接受一个通用函数对象并将变量的类型传递给它。

c++ - 在这个例子中,std::variant 是如何变成 valueless_by_exception 的?

这是受cppreference中示例启发的示例structS{operatorint(){throw42;}};intmain(){variantv{12.f};//OKcout(S());//vmaybevalueless}catch(...){}cout对于一个编译器,我试过它的输出false,true意味着emplace导致变体变得毫无值(value)我不明白这是怎么发生的。特别是我根本不明白为什么emplace被调用,我希望程序甚至不会调用它,因为从S到int参数的转换会抛出。 最佳答案 注意相关std::variant::