我可以覆盖并使用模板类型的子类作为超类

时间:2012-03-13 21:56:08

标签: c++ templates generics

我可以覆盖并使用模板类型的子类作为超类。

我是一名Java程序员,这适用于泛型,但我不熟悉如何在C ++中做很多事情

我可以使用课程

template <typename T>
class A{
public:
    T get(){
        return t;
    }
    A(){
    }
    void set(T tt){
        t=tt;
    }
private: 
    T t;
};

用类似于

的东西扩展它
class B:A<B> 

其中子类B用作A类的泛型类型,而B类不需要泛型

2 个答案:

答案 0 :(得分:1)

原则上,您对模板的使用称为“奇怪的重复模板模式”(CRTP)并且完全有效。

但是,请注意Java泛型和C ++模板在很多方面都有很大差异,包括在A中使用B的限制。派生的CRTP类在模板实例化时是不完整的,因此您不能分配任何对象他们像你一样在基类中。这就是代码无法编译的原因。通常的方法是使用访问器方法,例如:

 void set(T tt){
    static_cast<T&>(*this)=tt;
 }

答案 1 :(得分:0)