2013-01-21 50 views
3

考慮C++以下情況:使用基類的模板參數在派生類中

template<int n> 
class Base { ... }; 

class Derived3 : public Base<3> { 
    // a complicated body, making use of n=3 
}; 

class Derived7 : public Base<7> { 
    // a completely different body, making use of n=7 
}; 

裏面的Derived3成員函數,我想明確地使用n=3了,裏面Derived7n=7,沒有硬編碼的數字,即仍然指的是像模板參數n。下列選項來我的腦海:

  1. 而且模板化上n派生類,然後使用typedef。這樣,派生類知道n

    template<int n> 
    class DerivedTemplate3 : public Base<n> { ... }; 
    typedef DerivedTemplate3<3> Derived3; 
    
    template<int n> 
    class DerivedTemplate7 : public Base<n> { ... }; 
    typedef DerivedTemplate7<7> Derived7; 
    

    的問題,這是DerivedTemplateX做什麼也不要,n=X意義,所以這種感覺就像濫用模板範例。

  2. 使用靜態const成員存儲在nBase,並且指的是在派生類:

    template<int n> 
    class Base { 
    protected: 
        static const int nn = n; 
        ... 
    }; 
    
    class Derived3 : public Base<3> { 
        // refer to nn=3 
    }; 
    
    class Derived7 : public Base<7> { 
        // refer to nn=7 
    }; 
    

    這裏的問題是,我貌似不能使用相同的標識符(nnn)。另外,我不確定這是否允許我使用nn作爲派生類成員的模板參數。

那麼:如何以非冗餘,有效的方式實現呢?也許在某處使用某種static const int作爲成員?

回答

5

標準的做法是用大寫字母爲模板參數,然後以小寫靜態常量的值:

template<int N> 
class Base { 
protected: 
    static const int n = N; 
    ... 
}; 

然後你使用小寫靜態常量的值n無處不在 - 不使用任何地方N其他。

此外,我不確定這是否允許我使用nn作爲派生類成員的模板參數。

它是一個常量表達式,因此它可以用作模板參數。

+1

就是這樣。也可以使用'enum'來避免靜態成員變量。 –

+0

好的,謝謝。所以我的第二個建議實際上是標準做法,除了稍微不同的命名約定。 – Roman

+0

@KarelPetranek爲什麼要避免使用'static const int'成員變量? – Walter

0

這是否適合您?

template<int n> 
class Base { 
protected: 
    static const int MyN = n; 
}; 

class Derived3 : public Base<3> { 
    void f() 
    { 
     std::cout << MyN; 
    } 
}; 

class Derived7 : public Base<7> { 
    void f() 
    { 
     std::cout << MyN; 
    } 
}; 

int main() 
{ 

} 
相關問題