2017-07-07 89 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不再共享同一個基類。所以這隻有在你使用基類來避免代碼重複而不是多態時纔有用。