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
对于某些 X
的 std::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{};
有没有办法使用 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
对于某些 X
的 std::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{};