我有一个模板类(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)精心设计的策略的粗略概图,该策略允许在某处使用动态多态性而无需付出任何代价。

10-08 19:52