我正在尝试解决以下问题。我有一个指向自定义类的指针的向量(它实际上是一个自定义结构,但一个向量足以替代这个问题)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 */ }
我计划添加更多指向 class的指针A
,因此上述内容开始变得麻烦。我目前正在尝试使用的解决方案是boost::variant
:
class A {
public:
boost::variant<type_a*, type_b*> p;
};
不过,我遇到的问题是,我的一项操作涉及调用一个函数,该函数将根据p
我拥有的类型为变量分配一些值。这就是现在的情况,并且process_stuff
在上述if/else
语句之一中调用了适当的函数:
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
并会采取其他解决方案。