我正在使用一组类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)
基于类型擦除,静态成员函数和指针的可能解决方案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上看到它.
正如评论中所提到的,这里是一个略微修改的版本,它添加了减少用户样板的方法create和invoke方法.