【发布时间】:2023-03-25 18:45:01
【问题描述】:
我最近一直在学习 C++ 中 SFINAE 的概念,目前正在尝试在项目中使用它。
问题是,我正在尝试做的事情与我能找到的任何事情都不一样,而且我不知道该怎么做。
假设我有一个名为 MyParent 的模板类:
template <typename Elem>
class MyParent;
还有一个名为 MyClass 的非模板类,它继承了它,使用 char 作为 Elem:
class MyClass : public MyParent<char>;
现在,我想使用 SFINAE 来检查类型名是否继承 MyParent,无论使用什么 Elem 类型。
我不能使用std::is_base_of,因为父母的模板。
我已尝试执行以下操作:
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>,但我没能得到我想要的。
除了为继承自MyParent 的每个类定义is_my_parent 之外,还有什么方便的方法可以在C++ 中实现这样的目标吗?
【问题讨论】:
-
你可以添加到每个类,
using parent_t = MyParent<template_type>;,然后你可以检查。尝试编写一些代码来检查此类是否继承自任何MyParent<T>基本上是不可能的,因为T可能是无限的类型集。 -
你可以让
MyParent模板继承自一个空的class MyParentCommonBase{};。
标签: c++ templates inheritance sfinae