gpt4 book ai didi

c++ - 模板特化继承自特定的子类

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:10 25 4
gpt4 key购买 nike

class Base { ... };
class Derived1 : Base { ... };
class Derived2 : Base { ... };

template <> class BaseDecorator<Base> : **SpecificDerived** { ... };

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

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

关于c++ - 模板特化继承自特定的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54101660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com