gpt4 book ai didi

c++ - 模板可以用来检测继承关系吗

转载 作者:太空狗 更新时间:2023-10-29 21:20:19 24 4
gpt4 key购买 nike

假设我有以下代码(C++):

template < class Td, class Ud, class Vd>
class Extractor
{
private:
// some code here
public:
// the class has functions to populate these vectors
vector<Td* > list_of_layers;
vector<Ud* > list_of_resistors;
vector<Vd* > list_of_nodes;
}

我希望施加限制,即在实例化 Extractor 类的对象时用于替换 Td、Ud 和 Vd 的类始终派生自类(例如)T、U 和 V,分别。可能吗?

最佳答案

您可以使用 type_traits,尤其是 enable_if结合is_base_of像下面的例子:

#include <type_traits>

class BaseT {};
class BaseU {};
class BaseV {};

class DerivedT : public BaseT {};
class DerivedU : public BaseU {};
class DerivedV : public BaseV {};

template < class Td, class Ud, class Vd, class Enable = void>
class Extractor {
static_assert(std::is_base_of<BaseT, Td>::value, "Template argument Td is not derived from BaseT");
static_assert(std::is_base_of<BaseU, Ud>::value, "Template argument Ud is not derived from BaseU");
static_assert(std::is_base_of<BaseV, Vd>::value, "Template argument Vd is not derived from BaseV");
};

template <class Td, class Ud, class Vd>
class Extractor<Td, Ud, Vd,
typename std::enable_if<std::is_base_of<BaseT, Td>::value &&
std::is_base_of<BaseU, Ud>::value &&
std::is_base_of<BaseV, Vd>::value>::type> {

};

int main() {
Extractor<DerivedT, DerivedU, DerivedV> dummy;
Extractor<int, double, int> dummy2; // will fail to compile!!!
}

LIVE DEMO

关于c++ - 模板可以用来检测继承关系吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24902239/

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