【发布时间】:2023-03-02 23:43:01
【问题描述】:
我需要一些技巧来实现不支持的 c++:我需要混合动态和静态多态(虚拟和模板)。我需要什么(一些示意图代码):
class IManager
{
public:
template<class T>
void Set();
template<class T>
T *Get();
protected:
IManager *_parent;
};
class Manager1: public IManager{};
class Manager2: public IManager{};
// the main goal is a semantic:
IManager manager = Manager1;
// IManager manager = Manager2;
manager.Set<MyClass>();
MyClass *myClass = manager.Get<MyClass>();
这有点像服务定位器。但它有一些差异,我需要这样的接口声明。我已经有了这样的实现,但是没有接口(它只能通过构造函数中的选项进行配置,我想分离每个接口的实现)
更新: 现在我有2个实现: 1.我使用接口,但它的方法是通过参数覆盖模板参数的所有状态。而且我还有静态函数助手,它转换模板参数并将它们作为参数传递给接口
class Manager: IManager{};
Manager manager;
Helper::Set<T>( manager );
Helper::Get<T>( manager );
-
我不使用接口,而是在一个实例中注入所有不同的实现并通过构造函数参数对其进行配置。 两种解决方案都很丑。
班级经理{ 民众: 经理(选项); };
【问题讨论】:
-
这段代码是什么意思:
template<class T> void Set();它似乎不需要任何类型名 T ? -
这是原理图代码。 set 和 get 都需要这种类型
-
但为什么 set 需要它?这对我来说没有意义!函数的输入或输出中没有任何内容依赖于 T。在这种情况下,不使用模板。所以你想实现一些目标,但我看不到什么。
-
我从传递的类型信息中设置信息
-
含糊不清。更确切地说是什么?模板是编译时的东西。
标签: c++ templates polymorphism service-locator