我正试图解决以下问题。对于自定义类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
。这是它现在是什么,并适当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
工作(据我所知)我不能在二进制访问中有一个非变量类型作为参数,我也不能有一个非const operator()
使第二个变量成为访问者类的成员并使用一元访问修改operator()
的内部变量。所以我很困惑如何将上面的process_stuff
函数与boost::variant
一起玩。
顺便说一句我没有附加到boost::variant
并会采取其他解决方案。
简短的回答:除非你可以以某种方式统一类型,否则任何你做异构集合的方式,它可能会变得丑陋和笨拙。 –
我不能统一类型不幸的。我认为如果我能够做到这一点,这一切都会奏效。在'static_visitor'中有一个非const'operator()'。 – eddi