2012-02-23 108 views
0

我會很感激幫助專業的方法doIt()在代碼共享公共基類類以下位,如下圖所示專業類模板方法派生類

#include <iostream> 
#include <boost/utility.hpp> 
#include <boost/type_traits.hpp> 

struct BarBase {}; 
struct Bar: BarBase {}; 

struct FooBase {}; 
struct Foo: FooBase {}; 

template <typename T> 
struct Task 
{ 
    // I'd like to specialize this method for classes with a common base class 
    void doIt();   
}; 

// my attempt (does not compile) 
template <typename T> 
typename boost::enable_if<boost::is_base_of<FooBase, T> >::value 
doIt() { 
    std::cout << "Type is derived from FooBase\n"; 
} 


int main() 
{ 
    Task<Foo> f; 
    f.doIt(); 
} 
+0

我認爲你不能專注模板類的成員函數,你有專攻的類。 – sbi 2012-02-23 12:41:30

回答

1

你不能專注一個模板類成員。你可以專門化一個類,並且每個專業化都是一個完全獨立的類,它不從非專業化模板(它可能有也可能沒有全部或部分非專業化類的成員)繼承任何東西。

你也可以做的是在模板類中有一個模板成員函數,並且專注於此。所以你可以這樣做:

template <typename T> 
struct Task 
{ 
    void doIt() { doItPriv<T>(); } 
private: 
    template<typename T1> 
    void doItPriv(); 
}; 

然後專門doItPriv

0

this答案,

SFINAE只有在替換模板 參數的參數推導使得構造形成不良的工作。

這就是爲什麼你不能這樣做水木清華這樣的:

template <typename T> 
struct Task 
{ 
    typename std::enable_if<std::is_base_of<FooBase, T>::value>::type doIt() { 
     std::cout << "Type is derived from FooBase\n"; 
    } 

    typename std::enable_if<std::is_base_of<FooBase, T>::value == false>::type doIt() 
    { 
    } 
}; 

這裏doIt()沒有模板,所以沒有任何扣除。 但你可以做到以下幾點:

template <typename T1> 
struct Task 
{ 
    template <typename T> 
    typename std::enable_if<std::is_base_of<FooBase, T>::value>::type doIt_() { 
     std::cout << "Type is derived from FooBase\n"; 
    } 

    template <typename T> 
    typename std::enable_if<std::is_base_of<FooBase, T>::value == false>::type doIt_() 
    { 
    } 

    void doIt() 
    { 
     doIt_<T1>(); 
    } 
};