如何将一组不同类型的模板化组件传递给一个函数?
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
也是一种选择,但它有其自身的优缺点。
我有组件:
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
也是一种选择,但它有其自身的优缺点。