Designing hiearchical classes with template function
我正在编写一个类
1 2 3 4 | class Base { template<class T> void func(const T& t) { ... } }; |
有一个类
起初我想从
我也考虑过crtp,但它是一个选项,因为实例必须能够放入容器中,并且可以在不知道具体类型的情况下访问:
1 2 3 | std::vector<Base*> v = ...; v[0]->func(...); v[1]->func(...); |
对于可能类型的
这种情况的最佳解决方案是什么?
除此之外,你会为此类问题推荐参考书(最好是书籍)吗?
这不是很容易用C++完成的。它与所谓的"第一类多态"有关,这意味着如果C++中的值可以具有多态类型,那么这将是很容易的。事实并非如此。
如果您可以使用通用解决方案(这意味着代码
基本上,您将希望用一个类型不是泛型的参数替换您的
例如,假设
1 | virtual void func(const std::function<void(int)>& t) { ... } |
虚拟功能将开始工作。但是,这意味着在派生类中实现
然而,创建这种多态包装器的范围从简单(如
不能将编译时多态性(模板)与运行时多态性混合使用。问题是,使用模板时,编译器将按需生成代码,在您的特定情况下,您需要根据向量中对象的运行时类型来决定要实例化的成员函数。
如果可以与方法一起使用的类型数量有限,则可以提供不同的虚拟重载,如果不想手动执行此操作,则可以使用所有类型t定义类型列表,然后使用该类型列表生成方法…但这对于编码和维护来说是很糟糕的。
我建议您陈述问题的实际需求(而不是您建议的解决方案的需求),人们将能够提供替代方法。