我有一个模板类(class)
template <typename T>
class Templated {
T someValue;
//...
};
另一个类的成员类型为
Templated
。class Holder {
Templated t;
//...
};
由于
Holder::Templated
的实际类型未知,因此无法编译。我希望Holder::Templated
稍后进行初始化/创建,它的值和类型将从配置文件中读取。如何创建Holder
对象,但以后再添加实际的Holder::Templated
成员?我可以将一个基类添加到
Templated
并将基类指针保存在Holder
类中,但是我不喜欢这个选项。您还有其他想法让Holder
类与Templated
成员的类型无关吗?非常感谢你!
最佳答案
如果您不想在holder中保留指向templated
的基类的指针,则可以添加一个间接层,并让templated
本身持有指向其具体实现的指针。
class Holder {
Untemplated u;
//...
};
class Untemplated {
//...
struct Templated_base {
//... virtual interface
};
Templated_base* hook; // or better with smart pointers
template <typename T>
struct Templated : Templated_base {
// ... final interface
};
template <typename T>
Untemplated(T&& x) { hook = new Templated<T>(std::forward<T>(x)); }
};
这只是Sean Parent(请参见此文件:http://sean-parent.stlab.cc/papers-and-presentations/#better-code-runtime-polymorphism)精心设计的策略的粗略概图,该策略允许在某处使用动态多态性而无需付出任何代价。