如何将一组不同类型的模板化组件传递给一个函数?

How to pass a set of different kinds of templated components to a function?

我有组件:

struct ComponentStorage : Storage{
    ...
};

template<typename T = ComponentStorage>
class Component{
public:
T* storage;
...
}

派生出 类 的形式:

struct Component2Storage : Storage{
    ...
};

template<typename T = Component2Storage>
class Component2 : public Component<T>{...}

组件和存储都有多个继承级别。

我的问题与将组件作为输入的函数有关,例如:

void myFunction(unordered_set<Component*> components){...} // This won't compile

如何修改我的函数,以便我可以传递一个包含不同类型组件的集合,这些组件可能使用不同类型的存储?实际功能并没有区别对待不同种类的组件。

如果需要在同一个容器中存放不同的组件,就需要多态性。

所以你需要你的 Component 有一个共同的基础 class,才能这样对待它们。

struct ComponentStorage : Storage{
    ...
};

class ComponentBase {
    // ... define your common interface
}

template<typename T = ComponentStorage>
class Component : public ComponentBase{
public:
T* storage;
...
}

现在您可以将所有组件视为 ComponentBase* 并通过定义的通用接口处理它们。

在集合中存储 std::variant<...all the component types>std::any 也是一种选择,但它有其自身的优缺点。