C++ 概念:检查是否派生自具有未知模板参数的模板化类

dba*_*dba 11 c++ c++-concepts c++20

有没有一种方法可以使用 C++ 概念来要求类派生自模板化类,而模板化类的模板参数又是另一个模板化类的派生类。

例子:

template <class T>
class A{};

template <class T>
class B{};

class X{};
class Y : public A<X> {};

class Z : public B<Y> {};
Run Code Online (Sandbox Code Playgroud)

我如何办理登机手续B,这是某些人的T表格而不指定是什么?我不想添加到 的模板参数列表中,因为我不想在派生自的每个实例上更改代码(例如最后一行)。std::is_base_of<A<X>,T>XXXBBclass Z

Sto*_*ica 14

如果你想检查A具体的专业,那并不太困难。

template <class C>
concept A_ = requires(C c) {
    // IILE, that only binds to A<...> specialisations
    // Including classes derived from them
    []<typename X>(A<X>&){}(c);
};
Run Code Online (Sandbox Code Playgroud)

lambda 基本上只是重载以接受A特化的函数的简写。从此类专业衍生的课程也计入其中。我们使用我们正在检查的类型的参数调用 lambda...并且约束是 true 或 false,具体取决于调用是否有效(参数被接受)。

然后,只需将其插入即可:

template <A_ T>
class B{};
Run Code Online (Sandbox Code Playgroud)

这里是现场工作