2017-07-07 50 views
1

让我们假设我有一个基类Base<T>和很多Sub1<T>,... SubN<T>这是Base子类。 Base有某种成员函数foo,并在foo我需要创建一个新的实例。但是,我想总是从同一个孩子的模板创建新实例,但使用不同的模板参数(Sub1<T>::foo - >Sub1<U>Sub2<T>::foo - >Sub2<U>,...)。从`this`的模板创建实例?

例如, Sub1<float> a; auto b = a.foo();使b再次将是一个新的Sub1<int>(即使foo只对超载Base)。这甚至有可能吗?我将如何做到这一点?

+3

你就需要有一个“克隆”的虚函数,并在每个派生类中重写它。 –

+0

我也想到了这一点,但如果我可能需要更改模板参数,则不起作用。 – miho

+4

你自相矛盾。你想要同一个班级吗? 'Sub1 '和'Sub1 '是*完全不同的类。 – Angew

回答

3

如果你只是想实现在Base类中的方法:

template <typename T, template <typename> class D> 
struct Base 
{ 
    template <typename U, typename... Args> 
    D<U>* foo(Args&&... args) 
    { 
     return new D<U>(std::forward<Args>(args)...); 
    } 
}; 

template <typename T> 
struct Derived1 : Base<T, Derived1> 
{ 
    // Implementation specific to Derived1 
}; 

template <typename T> 
struct Derived2 : Base<T, Derived2> 
{ 
    // Implementation specific to Derived2 
}; 

int main() 
{ 
    Derived1<float> d1_float; 
    Derived2<float> d2_float; 

    auto d1_int = d1_float.foo<int>(); // has type Derived1<int> 
    auto d2_int = d2_float.foo<int>(); // has type Derived2<int> 

    return 0; 
} 

不过,现在Derived1Derived2不再共享同一个基类。所以这只有在你使用基类来避免代码重复而不是多态时才有用。