gpt4 book ai didi

c++ - 使用 SFINAE 检查 C++ 中的模板父类

转载 作者:行者123 更新时间:2023-12-04 11:51:34 25 4
gpt4 key购买 nike

我最近一直在 C++ 中学习 SFINAE 的概念,我目前正在尝试在一个项目中使用它。
问题是,我正在尝试做的事情与我能找到的任何事情都不一样,而且我不知道该怎么做。
假设我有一个名为 MyParent 的模板类:

template <typename Elem>
class MyParent;
还有一个名为 MyClass 的非模板类,它继承了它,使用 char 作为 Elem:
class MyClass : public MyParent<char>;
现在,我想使用 SFINAE 来检查类型名是否继承了 MyParent ,不管怎样 Elem类型被使用。
我不能用 std::is_base_of ,因为 parent 的模板。
我尝试执行以下操作:
template <typename T>
struct is_my_parent : std::false_type {};
template <typename Elem>
struct is_my_parent<MyParent<Elem>> : std::true_type {};
现在,如果我检查 is_my_parent<MyParent<Elem>>::value ,它给了我 true .哪个好。
但是,当我检查 is_my_parent<MyClass>::value 时, 我收到 false .哪一种有道理,因为 MyClass实际上不是 MyParent<Elem> ,但我没有设法得到我想要的。
除了定义 is_my_parent 之外,还有什么方便的方法可以在 C++ 中实现这样的功能吗?对于从 MyParent 继承的每个类?

最佳答案

你可能会

template <typename T>
std::true_type is_my_parent_impl(const MyParent<T>*);

std::false_type is_my_parent_impl(const void*);

template <typename T>
using is_my_parent = decltype(is_my_parent_impl(std::declval<T*>()));
Demo

关于c++ - 使用 SFINAE 检查 C++ 中的模板父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68581014/

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