从概念推导模板参数

Deduce template parameter from concept

我正在学习模板和概念。我正在尝试为派生自 class 的类型创建一个概念,但此 class 是一个模板。

template<typename T>
struct CAA{};

template<typename T, typename T2>
concept DerivedFromAA = requires() {std::derived_from<CAA<T2>,T>;};

是否可以在函数中使用这样的概念而不必明确告诉它 class 的模板类型?我对如何定义这样的概念的想法是错误的吗?

template<typename T>
void conceptTestFunc(DerivedFromAA<T> auto& aa)
{
}

//...

CAA<int> aa;
conceptTestFunc<int>(aa); // Without having to tell it "int"

(我正在用 Clang 编译它。)

模板不是类型。

所以如果 CAA 是一个模板,那么 CAA<int> 就是一个类型。

类型不能从模板派生,只能从另一种类型派生。这意味着必须对类型而不是模板进行检查。

另一方面,如果你想推导出 aa 的内部类型,那是可以做到的。

#include <concepts>

template<typename T>
struct CAA{};

template<typename T>
struct CBB{};

template<typename T, typename T2>
concept DerivedFromAA = std::derived_from<CAA<T2>,T>;

template<template <typename> typename Outer, typename T>
requires DerivedFromAA<Outer<T>, T>
void conceptTestFunc(Outer<T>& aa)
{
}

int main() {
    CAA<int> aa;
    conceptTestFunc(aa);
    CBB<int> bb;
    conceptTestFunc(bb); // This fails
}

你可能会

template<typename T>
concept DerivedFromAA = requires(T t) {[]<typename U>(CAA<U>&){}(t);};

static_assert(DerivedFromAA<CAA<int>>);

Demo

gcc 不喜欢 requires 中的 lambda,因此您可以在外部创建虚拟辅助函数。