2012-02-23 112 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>(); 
    } 
};