C++20 Template 模板概念语法

C++20 Template Template Concept Syntax

有了概念,C++20 提供了很好的语法,例如

template<typename T>
concept SomeConcept = true; // stuff here


template<typename T>
requires SomeConcept<T>
class Foo;

template<SomeConcept T>
class Foo;

其中两种概念约束方式class是等价的,只是后者更简洁

如果我现在有一些模板概念,比如

template<template<typename> typename T>
concept SomeOtherConcept = true; // stuff here

template<template<typename> typename T>
requires SomeOtherConcept<T>
class Foo;

我不知道没有要求条款的非冗长(简洁/简短)语法,例如

template<template<typename> SomeotherConcept T>
class Foo;

template<template<SomeOtherConcept> typename T>
class Foo;

没有成功,所以

声明这样一个模板模板的正确语法是什么 class 对模板模板参数有概念限制?

What is the correct syntax for declaring such a template template class with a concept restriction to the template template parameter?

编写依赖于模板模板参数或非类型模板参数的约束的唯一方法是使用 requires-clause。较短的 type-constraint 语法仅适用于约束类型的概念(因此得名 type-constraint):

template <typename T> concept Type = true;
template <template <typename...> class Z> concept Template = true;
template <auto V> concept Value = true;

// requires-clause always works
template <typename T> requires Type<T> struct A { };
template <template <typename...> class Z> requires Template<Z> struct B { };
template <auto V> requires Value<V> struct C { };

// type-constraint only for type concepts
template <Type T> struct D { };

// abbreviated function template definitely only for type concepts
void e(Type auto x);

这是我以前用过的技巧

使用类似于 noop 的函数在主表达式中定义一个 lambda,如下所示:

void noop(auto) {}

//...

template<typename T>
concept SomeConcept = true;

/*
template <template<typename>SomeConcept T>
struct Example {};
*/ //does not work

template <template<typename>typename T>
  requires requires() {
    {
      noop(
        []<typename TArg> requires SomeConcept<typename T<TArg>> (){}
      )
    };
  }
struct Example {};