概念可以与模板模板参数一起使用吗?

Can concepts be used with template template parameters?

本文关键字:一起 参数      更新时间:2023-10-16

让我们考虑以下代码:

#include <concepts>
template<typename X>
struct Concrete_M {
X f() const { return X{}; }
};
struct Concrete_X {};
template<typename T, typename X>
concept M = requires (T t)
{
{ t.f() } -> std::convertible_to<X>;
};
template<M<Concrete_X>>
struct C {};
const C<Concrete_M<Concrete_X>> c{};

我可以使用以下模板模板参数T吗?

template<template<typename> typename T, typename X>
concept M = requires (T<X> t)
{
{ t.f() } -> std::convertible_to<X>;
};

我应该如何更改

template<M<Concrete_X>>
struct C {};
const C<Concrete_M<Concrete_X>> c{};

正确使用更新的概念M?我正在寻找这样的东西:

template<typename X, /* ... */>
struct C {};
const C<Concrete_X, /* ... */> c{};

但我不明白我应该放什么而不是/* ... */评论。我试过了:

template<typename X, M<X>>
struct C {};
const C<Concrete_X, Concrete_M<Concrete_X>> c{};

但是GCC 10.0.1会引发错误:

(..."M"不约束类型 (...

概念的较短手型约束语法:

template <Concept T>
struct C { };

仅对Concept的第一个模板参数是类型参数的情况有效。如果不是这种情况,您必须简单地使用长格式语法:一个 requires-subation

template <template <typename> class Z>
requires M<Z, Concrete_X>
struct C {};

我初始示例的等效长格式是:

template <typename T> requires Concept<T>
struct C { };

长形式和短形式的含义相同 - 这里没有不同的功能。

相关文章: