2009-11-15 126 views

回答

3

您可以專門針對該類型的方法。例如。

template<typename T> 
struct TemplatedClass 
{ 
    std::string methodA() {return "T methodA";} 

    std::string methodB() {return "T methodB";} 
    std::string methodC() {return "T methodC";} 
}; 

// Specialise methodA for int. 

template<> 
std::string TemplatedClass<int>::methodA() 
{ 
    return "int methodA"; 
} 
4

您必須爲此特定類型創建partial (or full) specialization

+5

儘管你必須專門研究整個類型,但是你不能只是部分地專注於成員函數。這在答案中是隱含的,但可能會被誤解。 – 2009-11-15 10:43:23

+0

您可以通過使用基類來提供默認實現(並使該基類的構造函數/析構函數受保護以避免使用它)來解決此限制。 – 2009-11-15 14:40:33

2

蒂莫的答案只允許專門類作爲一個整體,這意味着編譯器不會自動成員函數從基類型複製到特殊類型。

如果您想在課堂中專門化一個特定的方法而不重新創建其他任何方法,則會稍微複雜一些。你可以通過傳遞一個大小爲零的模板結構作爲參數,這樣做:

template<typename T> struct TypeHolder { }; 

template<typename T> class TemplateBase { 
public: 
    void methodInterface() { 
     methodImplementation(TypeHolder<T>); 
    } 
    void anotherMethod() { 
     // implementation for a function that does not 
     // need to be specialized 
    } 
private: 
    void methodImplementation(TypeHolder<int>) { 
     // implementation for int type 
    } 
    void methodImplementation(TypeHolder<float>) { 
     // implementation for float type 
    } 
}; 

編譯器將內聯相應methodImplementationmethodInterface,還有的Elid大小爲零結構,所以這將是就好像您只對成員函數進行了專門化一樣。