很难解释我要做什么,我将尝试:假设一个基本class A包含一些变量,以及一组派生自A的类,这些类都实现了对从A继承的变量进行操作的方法bool test()。
class A {
protected:
int somevar;
// ...
};
class B : public A {
public:
bool test() {
return (somevar == 42);
}
};
class C : public A {
public:
bool test() {
return (somevar > 23);
}
};
// ... more classes deriving from A现在我有了一个class A实例,并设置了somevar的值。
int main(int, char* []) {
A a;
a.somevar = 42;现在,我需要某种容器,允许我迭代这个容器的元素i,在a的上下文中调用i::test() .即:
std::vector<...> vec;
// push B and C into vec, this is pseudo-code
vec.push_back(&B);
vec.push_back(&C);
bool ret = true;
for(i = vec.begin(); i != vec.end(); ++i) {
// call B::test(), C::test(), setting *this to a
ret &= ( a .* (&(*i)::test) )();
}
return ret;
}我该怎么做?我尝试过两种方法:
强制从B::*强制转换到A的
bool test()签名,以便它采用const A&类型的参数,而不是从A继承,我不喜欢这个解决方案,因为somevar必须是公共的。编辑:
解决办法(1)是:
typedef bool (A::*)() mptr;
std::vector<mptr> vec;
vec.push_back(static_cast<mptr>(&T::test));
std::vector<mptr>::iterator i;
for(i = vec.begin(); i != vec.end(); ++i) {
(a .* (*i))();
}我不确定静态石膏是否安全。
发布于 2010-04-16 13:07:53
这是迄今为止最干净的解决方案。它使用static
struct A {
int somevar;
};
struct B {
static bool test(const A& a) {
return (a.somevar == 42);
}
};
std::vector<bool (*)(const A&)> vec;
template<typename T>
void push(const T&) {
vec.push_back(&T::test);
}发布于 2010-04-16 12:16:28
最干净的解决方案是您建议的最后一个解决方案,使test成为A中的一个(纯)虚拟函数。
virtual bool test(const A& value) = 0;如果您很费心地让somevar公开,保持它的私有性,并且只提供一个公共get函数:
int getvar() const {return somevar;}发布于 2010-04-16 12:14:00
您正在尝试在B上调用A和C方法。别干那事。
您需要创建B和C的实际实例,将指向它们的指针存储在vector<A*>中,并在迭代期间调用在A中定义的纯虚拟test()成员函数( B::test和C::test将覆盖该函数)。
https://stackoverflow.com/questions/2652738
复制相似问题