c++ - 模板特化继承自特定子类
问题描述
class Base { ... };
class Derived1 : Base { ... };
class Derived2 : Base { ... };
template <> class BaseDecorator<Base> : **SpecificDerived** { ... };
SpecificDerived是否可以引用正在使用的特定 Derived 类?这样
BaseDecorator<Derived1> bd-d1;
会实例化一个继承自 Derived1 的 BaseDecorator 吗?
出现问题是因为我需要为库类及其所有派生类提供装饰器,但又希望尽可能保持代码干燥。
谢谢!
解决方案
如果我正确理解了您的问题,您希望您的 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
推荐阅读
- ios - 电话:url 方案在 ios 13 中显示为操作表?
- ubuntu - Kdenlive 录制纯音频画外音?
- android - MPPT 751 15 通过 VE.Direct 连接到 Raspberry Pi 3(Android of Things),但数据不可读
- java - 一次测试失败,如何解决这个问题?
- python - 用“范围”数据绘制直方图
- json - 如何使用 Jora 查询计算 JSON 中的唯一值
- reactjs - 为什么我不能将映射状态中的对象作为参数传递给我的反应路由链接
- java - 仅当文本或标签在特定标签之外时才替换它(可以嵌套),Java中的正则表达式
- android - Android APIv29 FileNotFoundException EACCES(权限被拒绝)
- apache - 如何在 Virtualmin 子服务器中设置文档根目录?