我有一个模板课程
template <typename T>
class Templated {
T someValue;
//...
};
和另一个成员类型为Templated
的类。
class Holder {
Templated t;
//...
};
由于Holder::Templated
的实际类型未知,因此无法编译。我希望Holder::Templated
稍后被初始化/创建,它的值和类型都将从配置文件中读取。如何创建Holder
对象,但以后再添加实际的Holder::Templated
成员?
我可以有一个Templated
的基类,并将基类指针保存在Holder
类中,但是我不喜欢这个选项。您还有其他想法让Holder
类与它的Templated
成员类型无关吗?
非常感谢您!
答案 0 :(得分:2)
如果您不想在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)精心设计的策略的粗略概图,该策略允许在某处使用动态多态性而无需付出任何代价。
答案 1 :(得分:0)
您可以使用std::any
来保存任何类型的值,或者使用std::variant
来保存一组类型的值。例如:
#include <any>
class Holder {
std::any t;
//...
};
答案 2 :(得分:0)
模板纯粹是编译时多态结构。您需要运行时多态性,可以在C ++中通过多种不同方式来实现:
继承+ virtual
函数:在具有接口和开放的实现器的情况下很有用;
std::variant
:在您拥有一组已知的封闭选择时很有用;
std::any
:当您要存储任意对象而不受任何限制时很有用
更多:std::function
,dyno,...