- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下代码:
typedef boost::variant<LandSearchParameter, WaterSearchParameter> SearchParameter;
enum Visibility{
CLEAR,
CLOUDY,
FOG,
SMOKE
};
class DetectionGenerator : public boost::static_visitor<double>{
public:
DetectionGenerator(const EnvironmentalFactors& factors);
double operator()(const LandSearchParameter& land, Visibility vis) const;
double operator()(const WaterSearchParameter& water, Visibility vis) const;
private:
const EnvironmentalFactors mFactors;
};
但如果我尝试将它与 boost::apply_visitor
一起使用通过以下方式:
SearchParameter param = globeCover.generateSearch(lat, lon, altitude);
Visibility vis = weather.generateVisibility(lat, lon, altitude, bearing);
DetectionGenerator detectGen(envFactors);
double prob = boost::apply_visitor(detectGen, param, vis);
并从 gcc 中获取以下内容:
error: no matching function for call to
‘apply_visitor(const SearchRescue::DetectionGenerator&, const boost::variant<boost::tuples::tuple<double, double, double, double, double, bool, bool, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, boost::tuples::tuple<std::size_t, std::size_t, double, double, double, bool, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>&, SearchRescue::Visibility)
如果我尝试包装 Visibility
boost::variant
中的枚举我只得到同样的错误而不是 Visibility
它读取上面的所有垃圾以及我为变体选择的任何名称。我已经阅读了有关 binary visitation 的 boost 文档但我不知所措。请注意,所有这些东西都在同一个命名空间内。
更新:
问题是我的尝试。上面没有显示的是我有访客作为 const
多变的。一旦我拿了 const
出图了,就编译了。谢谢大家试图帮助我。希望我能给予更多赞成票。
最佳答案
@Boaz Yaniv 的回答 100% 正确。 boost::apply_visitor<>
docs直接声明:
Overloads accepting two operands invoke the binary function call operator of the given visitor on the content of the given variant operands.
Yaniv 建议的补救方法 – 采用 Visibility
访问者构造函数中的对象——也是正确的解决方法。您表示这种方法对您不起作用;我保证问题出在您的尝试中,而不是方法中。 ;-] 下面是编译代码:
#include <boost/variant.hpp>
struct LandSearchParameter { };
struct WaterSearchParameter { };
struct EnvironmentalFactors { };
typedef boost::variant<
LandSearchParameter,
WaterSearchParameter
> SearchParameter;
enum Visibility
{
CLEAR,
CLOUDY,
FOG,
SMOKE
};
struct DetectionGenerator : boost::static_visitor<double>
{
DetectionGenerator(EnvironmentalFactors const& factors, Visibility vis)
: mFactors(factors),
mVis(vis)
{ }
double operator ()(LandSearchParameter const&) const { return 0.; }
double operator ()(WaterSearchParameter const&) const { return 0.; }
private:
EnvironmentalFactors mFactors;
Visibility mVis;
};
int main()
{
SearchParameter param = LandSearchParameter();
EnvironmentalFactors const envFactors;
DetectionGenerator const detectGen(envFactors, CLOUDY);
double const prob = boost::apply_visitor(detectGen, param);
}
如果这种方法仍然对您不起作用,那么您将需要编辑您的问题并使用您当前的实际代码对其进行更新。
附言你的制作方法Visibility
单型boost::variant<>
也应该工作,虽然这对我来说似乎很愚蠢。作为引用,这个编译:
#include <boost/variant.hpp>
struct LandSearchParameter { };
struct WaterSearchParameter { };
struct EnvironmentalFactors { };
typedef boost::variant<
LandSearchParameter,
WaterSearchParameter
> SearchParameter;
enum VisibilityT
{
CLEAR,
CLOUDY,
FOG,
SMOKE
};
typedef boost::variant<VisibilityT> Visibility;
struct DetectionGenerator : boost::static_visitor<double>
{
explicit DetectionGenerator(EnvironmentalFactors const& factors)
: mFactors(factors)
{ }
double operator ()(LandSearchParameter const&, VisibilityT const) const
{ return 0.; }
double operator ()(WaterSearchParameter const&, VisibilityT const) const
{ return 0.; }
private:
EnvironmentalFactors mFactors;
};
int main()
{
SearchParameter param = LandSearchParameter();
EnvironmentalFactors const envFactors;
DetectionGenerator const detectGen(envFactors);
Visibility vis = CLOUDY;
double const prob = boost::apply_visitor(detectGen, param, vis);
}
关于c++ - boost 二进制 static_visitor 和 apply_visitor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916619/
我继承自boost::static_visitor<>并定义了一个类如下: class move_visitor : public boost::static_visitor<> { private:
我的应用程序使用变体作为数据桶,将数据从一个对象传送到另一个对象。我看到的使用 apply_visitor() 提取绑定(bind)数据的示例具有 void operator(),因此 apply_v
#include #include "boost/variant/variant.hpp" #include "boost/variant/apply_visitor.hpp" using name
我正在学习 boost::variant 并使用 apply_visitor 访问其成员。所以,我写了下面的例子。我有指向模板化对象的指针作为我的类(class)成员。我想使用 apply_visit
出于某种原因,使用 boost 的变体(我知道有一个 c++17 版本,我在这里提供向后兼容性,而且 c++17 还没有被 clang++ 完全支持)导致一些奇怪的行为使用访问者范式时: 2 个参数,
我有一个 ShapeType 点,带有一些坐标 (1,2),我想在重载运算符 () 中使用 apply_visitor 将坐标 (3,4) 添加到我的点,这样点最终是 (4,6)。我的实现在哪里失败?
有人能告诉我为什么我在以下代码的最后一行遇到编译器错误吗? 注意:如果我删除以下行,我的代码将无错误地编译: appliedEqualityVisitor(compareValue); 代码如下: #
boost::variant 和 boost::apply_visitor 的简单示例代码: #include struct ExprFalse; struct ExprTrue; struct E
我收到以下编译器错误: /usr/include/boost/variant/variant.hpp:832:32: error: no match for call to ‘(const Start
如何制作 boost::apply_visitor (两种变体之一)类访问者的友元函数? 我尝试了以下方法:friend result_type boost::apply_visitor<>(decl
在下面的代码中,我将延迟 apply_visitor 的结果存储在 auto 变量中。我可以使用什么类型来代替 auto?是否可以使用 std::function? #include "boost/v
以下代码正确地将值 999 和“test”输出到控制台,但我该如何返回这些值呢?像注释行这样的东西是我的最终目标;返回我可以分配给自动变量的值(因为我不知道我将要处理的类型)。我计划使用 boost:
我有以下代码: typedef boost::variant SearchParameter; enum Visibility{ CLEAR, CLOUDY, FOG,
第一次使用 Boost,并尝试了解如何使用 boost::variant。请在下面找到示例程序和错误消息 (GCC v5.3.0, -std=c++14) #include #include #i
昨天我问了这个问题,“juanchopanza”回答了我的问题,但不幸的是我无法捕捉到一种有界类型。由于使用“访问者”更可靠,我也想知道是否有人可以使用“访问者”给我一个解决方案? 我正在寻找过滤已定
我们在生产代码中广泛使用了 boost::variant 的集合。我们从这个集合中提取值的方式是 for (auto & var : vars) { switch (var.which())
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我是一名优秀的程序员,十分优秀!