带有自定义类的Boost变体
boost variant with custom classes
我正在尝试boost-variant
与自定义类。我理解访问类内容的安全方法是使用boost::static_visitor
。你知道为什么下面的代码不能编译吗?boost::static_visitor
的签字/声明是否有要求才能使用?
我发现了这个问题为什么我不能'我访问这个自定义类型与boost::variant?但我没有得到它。
对
二自由度陀螺仪
#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>
struct CA{};
struct ca_visitor : public boost::static_visitor<CA>
{
const CA& operator()(const CA& obj ) const { return obj;}
};
struct CB{};
struct cb_visitor : public boost::static_visitor<CB>
{
const CB& operator()(const CB& obj) const { return obj;}
};
int main(){
typedef boost::variant<
CA
,CB > v_type;
v_type v;
const CA& a = boost::apply_visitor( ca_visitor(), v );
}
首先,boost::static_visitor<>
的模板参数应该指定调用操作符返回的类型。在你的例子中,ca_visitor
的调用运算符返回CA const&
,而不是CA
。
但这不是最大的问题。最大的问题是你似乎对variant<>
和static_visitor<>
应该如何工作有误解。
boost::variant<>
的思想是它可以保存的任何的值,这些值是你在模板参数列表中指定的类型。您不知道该类型是什么,因此您为访问者提供了几个重载调用操作符,以处理每种可能的情况。
因此,当您提供访问者时,您需要确保它具有operator()
的所有必要的重载,以接受variant
可以保存的类型。如果您没有这样做,Boost。Variant会导致生成编译错误(这是在帮您的忙,因为您忘记处理某些情况)。
这是你面临的问题:你的访问者没有一个调用操作符接受类型为CB
的对象。
这是一个正确使用boost::variant<>
和static_visitor<>
的例子:
#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>
struct A{};
struct B{};
struct my_visitor : public boost::static_visitor<bool>
// ^^^^
// This must be the same as the
// return type of your call
// operators
{
bool operator() (const A& obj ) const { return true; }
bool operator() (const B& obj) const { return false; }
};
int main()
{
A a;
B b;
my_visitor mv;
typedef boost::variant<A, B> v_type;
v_type v = a;
bool res = v.apply_visitor(mv);
std::cout << res; // Should print 1
v = b;
res = v.apply_visitor(mv);
std::cout << res; // Should print 0
}
相关文章:
- 如何通过std ::变体正确替换boost ::变体
- C 11中的Boost ::变体和多态性
- 是否可以使用Boost ::或Boost ::变体带有boost :: pool
- 使用访问者中的Boost变体中的类型不编译
- boost变体对通用方法的简单调用
- boost ::变体 - 为什么模板参数比const字符串参数具有更高的优先级
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 使用谷歌测试中的EXPECT_EQ比较两个boost::变体对象
- 访问带有额外参数的boost变体
- 静态多态性与boost变体单访问者与多访问者与动态多态性
- boost::变体为朋友类
- 如何打印可流式传输类型的 boost::变体
- Boost变体apply_viewer编译错误
- boost::变体访问者返回错误(最麻烦的解析?)
- 如何制作boost::变体的简化版本
- 什么是C++标准库中boost::变体的等价物
- Boost变体失败
- 是否可以使用包含boost::变体的STL容器,并在变体类型本身中使用相同的容器类型
- 如何使用具有模板转换运算符的非模板代理对象来避免指定boost::变体的类型
- 将boost变体的向量过滤成新的向量