模板专业化从特定的子类继承

时间:2019-01-09 00:26:32

标签: c++ templates

awk 'NR==FNR{a[$1]=$2;next} a[$3]{print $0 " " a[$3]}' cc4 bed_chr_4.bed > outfile

SpecificDerived 是否可以引用正在使用的特定Derived类?这样的

awk 'NR==FNR{a[$1]++;b[$1]=$2;next} a[$3] {print $0 " " b[$3]}' cc4 bed_chr_4.bed > outfile

会实例化从Derived1继承的BaseDecorator吗?

之所以出现问题,是因为我需要为库类及其所有派生类提供一个装饰器,但希望保持代码尽可能干燥。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,则希望您的BaseDecorator继承自特定的Derived类。

在这种情况下,您可以执行以下操作:

#include <iostream>
#include <type_traits>

class Base {
    public:
    virtual void f1() {
        std::cout << "Base::f1" << std::endl;   
    }
};

class Derived1 : public Base {
    public:
    void f1() override {
        std::cout << "Derived1::f1" << std::endl;   
    }
};

class Derived2 : public Base {
    public:
    void f1() override {
        std::cout << "Derived2::f1" << std::endl;   
    }
};

class Derived3 {
    public:
    void f1() {
        std::cout << "Derived3::f1" << std::endl;   
    }
};

template <typename T,
          typename = typename std::enable_if<std::is_base_of<Base, T>::value>::type >
class BaseDecorator;

template <typename T>
class BaseDecorator<T>: public T {
    public:
    void f2() {
        T::f1();
    }
};

int main() {
    BaseDecorator<Derived1> bd1;
    bd1.f2();

    BaseDecorator<Derived2> bd2;
    bd2.f2();

    //BaseDecorator<Derived3> bd3; // Compilation fails !!!
    //bd3.f2(); // Compilation fails !!!

    return 0;   
}

输出:

Derived1::f1
Derived1::f2
相关问题