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

C++ Concepts: Checking if derived from a templated class with unknown template parameter

有没有办法使用 C++ 概念来要求 class 从模板化 class 派生,其模板参数又是从另一个模板化 [=] 派生的 class 27=].

示例:

template <class T>
class A{};

template <class T>
class B{};

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

class Z : public B<Y> {};

如何在 B 中检查 T 对于某些 Xstd::is_base_of<A<X>,T> 形式而不指定 X 是什么? 我不想将 X 添加到 B 的模板参数列表中,因为我不想在每个派生 B 的实例中更改代码(例如最后一行class Z).

如果您想具体检查 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);
};

lambda 基本上只是一个 shorthand 函数,它被重载以接受 A 特化。 类 来自此类专业化的也算在内。我们使用我们正在检查的类型的参数调用 lambda...并且约束是 true 还是 false 取决于调用是否有效(参数被接受)。

然后,只需插入即可:

template <A_ T>
class B{};

Here it is working live.