1

我正在用c++11boost编程,我正在尝试实现某种框架,其中有人只需要从 类 Base继承并实现method(),这可能取决于其他继承。这些继承应该在主函数中自动创建,程序员无需进行任何修改。

class Base
{
public:
   virtual void method() = 0;
}

class A : public Base
{
public:
   static int state = 0;

   void method()  //
   {
      //do something with B
      A::state = B::state * 3;
   }
}

class B : public Base
{
public:
   static int state = 0;

   void method() //
   {
      //do something with A
      B::state = A::state * 2;
   }
}

int main()
{

//Access to an Array containing ONE pointer to each Inheritance

vector<Base*> inheritancesOfBase;
inheritancesOfBase.push_back(new A); // <- should be done automatically 
inheritancesOfBase.push_back(new B); // <- should be done automatically 

//PSEUDOCODE
for_each(base* pInh in inheritancesOfBase)
{

    pInh->method();
    clones.push_back(pInh->clone());

}


return 0;
}

我认为这应该可以通过一些花哨的元编程来实现,但是如何呢?

编辑:澄清

4

2 回答 2

0

所以,我们有类似的东西

class Base
{
public:
   virtual void method() = 0;
};

(不要忘记类后面的分号)和许多子类,而不仅仅是AB显示。

我们想做main类似的事情

for(Base & item : instances)
{
    item.method();
}

您可以创建一个工厂,跟踪它在 a 中创建的内容并在被询问时 vector<shared_ptr<Base>>返回。 这样就解决了一半的问题。如果你想找到所有派生自 的类,鉴于 C++ 没有反射,我看不出你会怎么做。您可以使用 clang 拼凑一些东西并以这种方式生成一些代码。RecusiveASTVisitor可能会有所帮助。instances
Base

于 2013-07-22T11:02:29.053 回答
0

首先:您的代码将无法编译,因为您缺少静态定义。您需要将int A::state = 0(或类似的)添加到代码中,对于B::state.

其次,不可能自动创建 A 和 B 对象,因为编译器无法知道您对代码的意图是什么。因此,您至少需要在 main 中有一些 A 和 B 对象的声明。例如,编译器应该如何知道您需要一个 A 和五个 B 对象?所以你必须向编译器说明你的意图:

int main(void)
{
    A myA;
    B myBArray[5];
    vector<shared_ptr<Base>> myABCollection;
}
于 2013-07-22T09:41:39.640 回答