将类转换为派生类,而不进行修改

Tom*_*eus 2 c++

我正在使用一组类A,B...这些类是独立的,除了它们有一个method共同点.现在我想在向量中组合这些类,以便method在一个循环中调用.似乎最好的解决方案是从类中创建类派生类Parent(见下文).

现在问题如下.我想创建为每个类(一个只有头库a.h,b.h...).在那里,我希望课程完全独立.仅在主模块中,我想将类"附加"到a Parent以便能够将它们组合在一个向量中.我该怎么做呢?或者我是否必须使用void*指针向量?或者是否有另一种方法将这些类组合在一个向量中?


列表中的类:具有父/子范例

这是我能够组合向量中的类.注意我特别想避免类定义中的父/子范例.但我仍然希望将它们组合在一个向量中.

#include <iostream>
#include <vector>
#include <memory>

class Parent
{
public:
  virtual ~Parent(){};
  virtual void method(){};
};

class A : public Parent
{
public:
  A(){};
  ~A(){};
  void method(){};
};

class B : public Parent
{
public:
  B(){};
  ~B(){};
  void method(){};
};

int main()
{
  std::vector<std::unique_ptr<Parent>> vec;

  vec.push_back(std::unique_ptr<Parent>(new A));
  vec.push_back(std::unique_ptr<Parent>(new A));
  vec.push_back(std::unique_ptr<Parent>(new B));

  for ( auto &i: vec )
    i->method();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用例如编译

clang++ -std=c++14 main.cpp
Run Code Online (Sandbox Code Playgroud)

sky*_*ack 5

基于类型擦除,静态成员函数和指针的可能解决方案void根本没有使用virtual(示例代码,远非生产就绪):

#include <iostream>
#include <vector>

struct Erased
{
    using fn_type = void(*)(void *);

    template<typename T>
    static void proto(void *ptr) {
        static_cast<T*>(ptr)->method();
    }

    fn_type method;
    void *ptr;
};

struct A
{
  void method(){ std::cout << "A" << std::endl; };
};

struct B
{
  void method(){ std::cout << "B" << std::endl; };
};

int main()
{
  std::vector<Erased> vec;

  vec.push_back(Erased{ &Erased::proto<A>, new A });
  vec.push_back(Erased{ &Erased::proto<B>, new B });

  for ( auto &erased: vec ) {
      erased.method(erased.ptr);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这有助于避免使用公共基类.在wandbox上看到它.


正如评论中所提到的,这里是一个略微修改的版本,它添加了减少用户样板的方法createinvoke方法.