如何将类型名传递给我不想模板化的类?
How can I pass typename to a class that I don't want to templatize?
我有以下问题(简化版):
Interface X;
class Y : public X { ... }
class Z : public X { ... }
class A
{
map<int, X> m;
init() { X bla = new Y or Z; map.insert(...) }
}
我想在创建 A 时指定 Y 或 Z,从而根据指定的类型获得不同的功能。目前我可以"模板化"A,但这意味着我为 A 定义的每个函数都必须指定模板,即使我只需要在一种方法中使用它。此外,我使用的是 g++ 4.2.4,这意味着我无法将函数的实现与头文件分开。
听起来模板确实是矫枉过正,某种形式的依赖注入更合适。您可以将X
的特定实例传递给A::init
,例如:
init(X &bla) { map.insert(...); }
或者传入工厂函数:
init(X (*factory)()) { X bla = factory(); map.insert(...); }
或者执行其中任何一个,但将实例或工厂函数传递给 A
的构造函数。
。即使我只需要在一种方法中使用它......
在这种情况下,通常要做的是将未模板化的通用功能移动到基类,并定义继承基功能的模板化A
。 即:
class A_base {
// common things go here, they can be implemented in a .cpp file.
};
// This is the part that depends on T
template<class T>
class A : public A_base
{
map<int, T> m;
void init() { T *bla = new T; map.insert(...) }
};
这是减少代码膨胀的常用技术。如果A_base
需要调用A
的方法,可以将其设为virtual
。
如果,从new
的使用来看,它实际上是map<int, X*> m
和X* bla=...
,你可以"模板化"只是init()
,根据其模板参数创建一个Y
或Z
。
或者,你可以有一个工厂方法用于X
派生对象,该方法根据enum
返回Y *
或Z *
;或者让init
的调用者指定一个返回适当的X
派生类型的工厂函数。
相关文章:
- 为什么我不能在运算符=中使用引用类型?
- 我不想导出的函数的未记录代码对象警告
- 类构造函数,它接受对不同对象的引用,我不想复制该对象
- 我不想要最后一个数字/值后面的逗号,如何删除它(c ++,循环)
- 如何将类型名传递给我不想模板化的类?
- 在Visual Studio中,我不想提交我的Debug文件夹,但它中有dll文件,如果我移动它,项目将无法编译
- 如何在 cocos2dx 中从 DrawNode 中删除色点,但我不想从父级中删除孩子。只需删除它的某些点
- 我不想在使用 std::cin 后跳出换行符
- 如果我不想在 QAbstractItemView 中实现选择,我应该返回哪些值?
- 在 Linux 中打开文件。我不想创建写保护文件
- 如何在c++中声明变量我不想定义它,所以它不应该只消耗声明中的任何内存
- c++boost格式float-如何指定我不想要的.以及后面的零
- C++ 我不想要最后一个值后面的逗号
- 我想要一个接受指向成员的指针的模板函数,但我不想传递类类型或成员类型
- 当我不知道类型时如何将参数传递给函数
- 我不想使用 std::copy...他的这个正确的循环替代方案?
- make_heap() 函数参数 - 如果我不想包含某些元素怎么办?
- C++ 重新启动我的刽子手游戏时,我的分数以及我不想要的玩家信息被删除
- 如果我不想让某人知道或更改硬编码值,宏是否比静态常量更安全?
- 我不想使用root作为全局