当前位置: 首页 > 知识库问答 >
问题:

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

越健
2023-03-14
#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{};
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{};
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{};

(...)“m”不约束类型(...)

共有1个答案

钦高峯
2023-03-14

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

template <Concept T>
struct C { };

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

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

对于我最初的示例,等价的更长形式是:

template <typename T> requires Concept<T>
struct C { };
 类似资料:
  • 对于概念,提供了很好的语法,如

  • 有了C++20和概念,我想知道是否可以写一个概念来检查一个类型是否有一个带有特定名称的函数,该函数接受任意数量的任意参数。 以下面的代码为例(使用GCC当前的概念TS语法):

  • 问题内容: 我有一个Flask网站,并且想使用AngularJS JavaScript框架。不幸的是,似乎分隔符重叠。 如果两个都依赖于双花括号(),如何将Angular与Jinja2配合使用?可能吗 问题答案: 您有一些选择。 1)更改Angular的定界符表示法: 无论选择什么作为开始和结束符号,都将充当新的分隔符。在这种情况下,您可以使用将变量表示为Angular 。 这种方法的优点是只需要

  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 我试图重载一个乘法运算符,但不想输入多个重载函数来考虑整数与浮点、整数与双精度、浮点与整数的乘法等等。。。我希望编写一个重载运算符来解释所有带浮点数、整数和double的乘法组合,并得到正确的返回类型。我得到的错误是,没有找到接受“Widget::Widget”类型的右操作数的运算符(或者没有可接受的转换)。我想这是因为我正在使用decltype来设置返回对象小部件的模板类型。如果返回不是模板对象