问题标签 [static-visitor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1924 浏览

c++ - Boost:为什么 apply_visitor 在此代码中不起作用

我收到以下编译器错误:

/usr/include/boost/variant/variant.hpp:832:32: error: no match for call to '(const StartsWith) (bool&)'</p>

对于以下代码。有人知道为什么吗?

0 投票
1 回答
780 浏览

boost - boost apply::visitor -> 丢弃限定符

我使用 boost::variant 制作了一个程序,但不知何故 const 不正确。

错误:将 'const CompareTitle' 作为 'bool CompareTitle::operator()(const T1&, const T2&) [with T1 = TestSeizoen, T2 = TestSeizoen]' 的 'this' 参数传递,丢弃限定符 [-fpermissive]

[T1=TestFilm, T2 = TestSeizoen] 等的相同错误。

这是代码:

我试图使 operator() 成为 const 成员函数,但这并没有解决问题。有人可以帮忙吗?如果需要,我可以提供更多信息。提前致谢。

0 投票
1 回答
723 浏览

c++ - 让 static_visitor 在遍历 Boost 递归变体时对其进行修改?

我广泛使用 Boost 的变体类型来构建树。更准确地说,我使用 Boost 的 Qi 从语法中解析一棵树,然后遍历树以用整数注释每个节点 - 至少这是我想要做的。

我刚刚意识到,由于 static_visitor 不会将节点作为指针访问,因此我不可能修改 value 字段。所以我试图让 static_visitor 在变体类型的指针上工作,而不是变体本身。

一个简化的例子:

但它不起作用。当我尝试这样做时:

我收到一个错误:

我怎样才能让 static_visitor 做我想做的事?有一个更好的方法吗?目前,我正在考虑的唯一想法是使节点结构内的字段成为指向 int 的指针,而不是 int。

0 投票
1 回答
353 浏览

c++ - 这个访问者实现是否正确?

我正在实现一个访问者,以便将它与boost 变体库一起使用。我想知道专门boost::static_visitor<>使用 const 引用类型是否正确。

请注意我的问题如下:

专攻有什么问题boost::static_visitor<>boost::static_visitor<const T&>

0 投票
3 回答
1150 浏览

c++ - 将静态访问者与静态多态层次结构耦合

我的程序的目的是创建一个数据列表,在我的类层次结构中使用静态多态性时,我可以使用一组静态访问者访问该列表。

我通过 CRTP 创建了一个利用静态多态性的类层次结构:

我想将 DerivedBaseData 存储在一个包含中,以便以后迭代和访问。

我正在寻找一种将我的静态访问者与我的静态多态层次结构相结合的方法。我的静态多态性中需要一个 VirtualBaseData 类,它不是模板类,以便在容器中使用这些类。但是,由于我不能让 VirtualBaseData 类成为模板类,因此我无法像在 CRTPattern 中那样为派生类创建适当的 static_cast。

我的问题是:有没有人有一个好的策略可以保留我的静态多态设置以及静态访问者模式?

供参考:我已经按照http://hillside.net/plop/2006/Papers/Library/portableProgrammingPL.pdf第 21-23 页中的描述实现了我的静态访问者

0 投票
2 回答
1402 浏览

c++ - 提升::变体。boost::visitor 重载函数

我对重载函数的变体值有疑问。我想根据变量中存储的内容,用 int 或 string 调用重载函数。这就是我想这样做的方式,但我不能:

是否可以使用访问者编写它,或者我应该这样做:

我尝试对 MyVisitor 使用可变参数,但由于 boost::static_visitor 接口而失败。也许有一个解决方案。

int z in function 只是为了表明 foo() 参数中不仅有 boost::variant。

0 投票
1 回答
85 浏览

c++ - apply_visitor 不改变对象

我继承boost::static_visitor<>并定义了一个类,如下所示:

这个类应该改变一些对象的 x 和 y 位置,Point、Line 和 Circle。

当我执行以下代码时:

p保持为 1, 2 和l. 为什么我的对象在“apply_visitor”之后没有改变?

0 投票
1 回答
49 浏览

c++ - boost::static_visitor 作为地图值

我正在尝试为 ints 创建一个查找表到 boost::static_visitor

但是,当我执行以下操作时:

我得到错误:

术语不计算为带 2 个参数的函数(编译源文件解释器.cpp)

我怎样才能使 static_visitor 需要 2 个参数来匹配Mul

0 投票
1 回答
91 浏览

c++ - boost::variant 将 static_visitor 应用于某些类型

我有以下变体:

我想创建一个访问者来将一个intfloat类型转换为一个bool类型。

但是,这给了我错误消息:

'TypeVariant ConvertToBool::operator ()(float) const':无法将参数 1 从 'T' 转换为 'float'

允许访问者仅适用于某些类型的正确方法是什么?

0 投票
1 回答
71 浏览

c++ - 使用访问者时提升变体转换错误

我并不是要编码转储,但这确实是我可以创建的最小的可重现示例,即使在删除所有逻辑以使其更清晰之后也是如此。

本质上,我试图在 C++ 中实现我自己的一些基本类型版本,以通过将类型存储在调用的 boost::variant 中Values并使用boost::static_visitors 对Value变体执行操作来模拟动态类型。我试图实现的一个操作是not equals操作员,我创建了一个访问者Not_Equal来实现这一点。运算符将Not_EqualSFINAE 与 alow_priorityhigh_prioritystruct 一起使用,以确定是否允许操作中使用的两种类型。

变体中的类型Values是:{ SpecialInt, SpecialBoolean, std::shared_ptr<SeriesInt>, std::shared_ptr<SeriesBoolean>}。SeriesInt和是智能指针的原因SeriesBoolean是因为它们在我的真实版本中存储了大量信息,因此复制它们会很昂贵。

接受的 != 运算符如下:

由每个类中的运算符重载表示。

问题出现在 line 的访问者中return a != b; ,其中操作符类型不是 shared_ptr 的,因此要么SpecialInt或要么SpecialBoolean导致错误:

错误 C2446 '!=':没有从 'SeriesInt *' 到 'SeriesBoolean *' 的转换

错误 C2446 '!=':没有从 'SeriesBoolean *' 到 'SeriesInt *' 的转换

我不明白它与它有什么关系,SeriesBoolean*或者SeriesInt*因为它只能接受 and 的类型SpecialIntSpecialBoolean但我注意到当我删除带有参数的构造函数时SpecialIntSpecialBoolean代码可以正常编译和运行。我需要这些构造函数将值加载到类中(逻辑已删除)所以我的问题是为什么会出现这些错误以及如何解决这个问题?