变异变量与非变异类型的相互作用
variant variable interaction with a non-variant type
我正在努力解决以下问题。我有一个指向自定义类A
的指针向量(实际上它是一个自定义结构,但向量是这个问题的一个很好的替代品)。类A
实际上可以存储type_a
指针或type_b
指针(这些类型非常不同,彼此不相关)。现在,这是通过保留两者来实现的,将它们设置为NULL
,然后稍后使用一堆if/else
语句来检查它是哪种类型并执行适当的操作。
class A {
public:
A() : p1(NULL), p2(NULL) {}
type_a * p1;
type_b * p2;
};
std::vector<A *> v;
...
if (v[0]->p1 != NULL) { /* do this */ }
else if (v[0]->p2 != NULL) { /* do that */ }
我计划向类A
添加更多的指针,因此上面的内容开始变得麻烦起来。我目前正在尝试的解决方案是使用boost::variant
,以获得:
class A {
public:
boost::variant<type_a*, type_b*> p;
};
不过,我遇到的问题是,我的一项操作涉及调用一个函数,该函数将根据我所拥有的p
类型为变量分配一些值。这就是现在的情况,在上面的if/else
语句中调用适当的process_stuff
函数:
class B { /*...*/ };
void process_stuff(type_a * p, B * b) {
b->m_var = p->fn1();
}
void process_stuff(type_b * p, B * b) {
b->m_var = p->fn2();
}
我无法将其用于boost::static_visitor
,因为(据我所知)我不能在二进制访问中使用非变量类型作为参数,也不能使用常量operator()
使第二个变量成为访问者类的成员,并在operator()
中使用一元访问对其进行修改。所以我很困惑如何将上面的process_stuff
函数转换为与boost::variant
一起使用。
顺便说一句,我不喜欢boost::variant
,会采取其他解决方案。
您只需要一个有状态的访问者。我打这封信是出于对访客长相的模糊记忆,但你应该能够纠正我犯的任何错误。
class process_stuff_visitor : public boost::static_visitor<void> {
B* m_b;
public:
process_stuff_visitor(B* b) : m_b(b) {}
void visit(type_a* a) const { m_b->m_var = a->fn1(); }
void visit(type_b* b) const { m_b->m_var = b->fn2(); }
};
// actual processing:
boost::apply_visitor(v[0], process_stuff_visitor(the_b));
或者,由于您分配给B的同一个成员,您可以只提取值生成部分。
struct generate_stuff_visitor : public boost::static_visitor<TypeOfMVar> {
TypeOfMVar visit(type_a* a) const { return a->fn1(); }
TypeOfMVar visit(type_b* b) const { return b->fn2(); }
};
the_b->m_var = boost::apply_visitor(v[0], generate_stuff_visitor());
做你想做的事情的一种非常通用的面向对象的方法(如果我理解正确的话)是为类型A和b(以及你想要的任何其他类型)创建一个虚拟基类,它定义了一个纯虚拟方法。这个方法将为每种类型返回不同的东西(例如,type_b::method可以返回'b',而type_a::method可以返回'a'),所以当你在未指定的类型上调用该方法时,你会被告知它是什么类型。
从那里,您可以使用标识方法的返回值作为switch语句的主题,或者使用其他一些常规的控制结构来调用正确的行为。
- 迭代器在递增和递减时是否保证会变异?
- Kotlin、NDK和C++的相互作用
- 使用变异模板的正方形总和
- 具有与行模板的变异模板扩展有关的EIGEN
- 2个模板构造函数的组合构建与变异模板.如何
- 具有变异模板模板参数的方法的部分专业化
- 可变引用以及指针如何与内存相互作用
- 调用每种类型的变异模板的正确模板专业化
- 扣除指南和变异模板
- 匹配的变异非类型模板
- 隐藏变异模板实现
- 检查指针是否是带有变异模板的派生的指针
- 我如何实现变异模式以将可变数量的参数转发到C 11中的函数
- 变异模板中的功能顺序
- 如何与C 中的位填充相互作用
- 组合类模板默认参数和变异参数
- 继承具有变异参数的构造函数
- 如何制作递归编译时间变异结构模板
- C 参数包作为变异模板
- 变异变量与非变异类型的相互作用