我怎样才能使类的成员类型无关?

时间:2018-11-20 14:13:02

标签: c++ templates

我有一个模板课程

template <typename T> 
class Templated {
    T someValue;
    //... 
};

和另一个成员类型为Templated的类。

class Holder {
    Templated t;
    //...
};

由于Holder::Templated的实际类型未知,因此无法编译。我希望Holder::Templated稍后被初始化/创建,它的值和类型都将从配置文件中读取。如何创建Holder对象,但以后再添加实际的Holder::Templated成员?

我可以有一个Templated的基类,并将基类指针保存在Holder类中,但是我不喜欢这个选项。您还有其他想法让Holder类与它的Templated成员类型无关吗?

非常感谢您!

3 个答案:

答案 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::functiondyno,...