草庐IT

C++17 std::variant 头文件 (clang 6.0.0)

更新我将问题缩小到(可能!这还不完全清楚,甚至阅读了我能找到的关于该主题的所有内容)安装stdlibc++-7-dev会为我提供合适的(即C++17兼容)STLheader和库。这(同样,显然)与Ubuntu17.04(artful?)捆绑在一起,但不适用于xenial(Ubuntu16.04.3LTS),这就是我的我正在使用。我已经尝试下载单独的.deb包并安装它们,但它很快就会变成一个Unresolved依赖项的迷宫。如果有人能告诉我如何在16.04上安装libstdc++-7-dev,我将不胜感激。原始问题我刚刚通过包管理器(在theseinstructions之后)在Ubunt

c++ - 为什么不允许 std::variant 与其替代类型之一进行相等比较?

例如,相等比较std::variant应该很有帮助用T1或T2.到目前为止,我们只能与相同的变体类型进行比较。 最佳答案 一个变体可能有多个相同类型的拷贝。例如。std::variant.std::variant的给定实例比较等于另一个当且仅当它们持有相同的变体备选方案并且所述备选方案的值比较相等。因此,一个std::variant与index()0比较不等于std::variant与index()1,尽管活跃的变体替代品具有相同的类型和相同的值(value)。因此,标准没有实现通用的“与T比较”。但是,您可以使用中的其他辅助实用程

c++ - 返回未知类型的函数

classTest{public:SOMETHINGDoIt(inta){floatFLOAT=1.2;intINT=2;charCHAR='a';switch(a){case1:returnINT;case2:returnFLOAT;case3:returnCHAR;}}};intmain(intargc,char*argv[]){Testobj;cout现在,使用a=1意味着我需要返回一个整数等知识,Doit()是否可以返回可变数据类型的变量?本质上,我应该用什么替换SOMETHING?PS:我正在尝试寻找一种替代方法来返回包含这些数据类型的结构/union。

c++ - 如何在 "two dimensional manner"中使用 boost::variant 定义异构 std::map

我很乐意得到并建议如何以“二维方式”处理boost::variant。听起来很奇怪,但让我的代码说得更多(希望如此):我编写了一个名为Parameter的类:templateclassParameter:publicquantity{...}上面定义的我的参数的示例用法:ParameterSampleParameter1;ParameterSampleParameter2;正如我试图通过上面的示例解释的那样,我可以使用boost::units::si::???和不同的数据类型(如double,short)定义多个参数类型,int等我的目标是构建一个std::map容器,它可以存储任何P

c++ - 我可以在 C++ 中扩展变体吗?

我不确定这是否可能,但假设我有:usingmy_variant=std::variant;现在,我创建了一个Class4并想延长my_variant2包括所有my_variant连同Class4(以一般方式,即不只是使用另一个using...)这样我就可以做一些事情,比如创建一个数组std::array.这是可以做到的吗? 最佳答案 godbolted#includetemplatestructconcatenator;templatestructconcatenator,Args1...>{usingtype=std::varia

c++ - boost::variant 类型转换

我有来自boost库的以下变体:typedefboost::variantvariant;现在我想从声明为“value”的变量中获取一个值'在structnode,所以我想我可以工作通用并调用函数:find_attribute(attribute);,但是编译器说它不能从variant转换为long或我给它的任何其他类型。我做错了什么?templateTfind_attribute(conststd::string&attribute){std::vector>::iteratornodes_iter=_request->begin();for(;nodes_iter!=_reques

c++ - 是否有具有多访问方法的可变参数模板变体?

我在boost::variant中达到了50种类型的限制.我找到了thisniceself-containedheader但它缺少多次访问功能(我实际上需要双重访问)。我试着看一下它,但这种方法似乎非常雄心勃勃,并且与我缺乏元编程经验相冲突......如果您能指出一个预煮的变体实现或提供一些建议来扩展上面我喜欢的那个,那就太好了,谢谢!致FilipRoséen和投票者:here您会找到我正在考虑的设计的基本示例。请随时添加更多关于此的深入评论。 最佳答案 编辑:Boost现在支持multi-visitation,C++17varia

c++ - 如何确定 boost::variant 变量是否为空?

我定义了一个boost::variantvar是这样的:boost::variantfoo;此变量在实例化但未初始化时具有boost::blank类型的值,因为boost::blank是传递给模板化boost的第一个类型::变体。有时,我想知道foo是否已经初始化。我试过这个,但没有好的结果:if(foo)//doesn'tcompileif(foo!=boost::blank())//doesn'tcompileif(!(foo==boost::blank()))//doesn'tcompile我认为值得注意的是,当foo已初始化(例如,foo=true)时,可以通过执行foo来“重

c++ - 在 std::variant 中按类型获取索引

标准库中是否有实用程序可以获取std::variant中给定类型的索引?还是我应该自己做一个?即我要获取B的索引在std::variant并获得返回1.有std::variant_alternative为相反的操作。当然,std::variant上可能有很多相同的类型的列表,所以这个操作不是双射,但对我来说不是问题(我可以在列表中第一次出现类型,或者在std::variant列表中出现唯一类型)。 最佳答案 几年后更新:我在这里的回答可能很酷,但是this是正确的。这就是我今天要解决这个问题的方法。我们可以利用index()几乎已经

c++ - std::visit for variant 无法在 clang 5 下编译

这个问题在这里已经有了答案:getforvariantsfailunderclang++butnotg++(1个回答)关闭4年前。std::visit的以下使用在gcc7.2下可以正确编译,但在clang5.0下无法编译。有谁知道问题出在哪里?#includestructS1{intfoo(){return0;}};structS2{intfoo(){return1;}};usingV=std::variant;intbar(){Vv;returnstd::visit([](auto&s){returns.foo();},v);}第一个错误是这样的:include/c++/7.2.0/