c++ - 为派生类特化类模板方法

标签 c++ templates sfinae

对于共享公共(public)基类的类的以下代码,我很感激帮助专门化方法 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();
}

最佳答案

您不能专门化模板类成员。您可以特化一个类,每个特化都是一个完全独立的类,不从非特化模板继承任何内容(它可能具有也可能不具有非特化类的全部或部分成员)。

你还可以做的是在模板类中有一个模板成员函数,并专门化它。所以你可以这样做:

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

然后特化doItPriv

关于c++ - 为派生类特化类模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413241/

相关文章:

c++ - 检测算子 +

c++ - 从函数 c++ 返回后的错误值

c++ - 如何根据枚举参数返回不同的类型

c++ - 根据类型特征专门化强制转换运算符

c++ - 从表中检索混合数据类型的模板化 get 方法

c++ - 在 C++ 中自动选择模板的类型名称

c++ - 模板参数包 : How to create a Tuple of an independent type with same length

c++ - 为 g++ 永久添加包含路径和共享库

c++ - 将 "getline"与数组一起使用

c++ - 如何以优雅的方式转储 XML?