概念可以与模板模板参数一起使用吗?
Can concepts be used with template template parameters?
让我们考虑以下代码:
#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 { };
长形式和短形式的含义相同 - 这里没有不同的功能。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- 概念可以与模板模板参数一起使用吗?
- 如何在Visual Studio 2017上将类方法设置为参数并将它们与lambda一起使用?
- 为什么当我尝试将priority_queue与参数一起使用作为指向结构的指针时会弹出错误
- 标准::原子::compare_exchange与两个memory_order参数一起使用的真实示例
- 如何在 C++ 中将 typedef 与类初始值设定项参数一起使用?
- 我可以将"token pasting operator"与"const"模板参数一起使用吗?
- 如何将可选参数与基于 QAxFactory 的 API 一起使用
- 哪个强制转换应与模板类参数一起使用,dynamic_cast或reinterpet_cast?
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 有没有一种干净(更)的方法将 CRTP 与可变参数继承混合在一起?
- 将 auto 与生成元组的可变参数模板一起使用
- 将 boost::function 与指向派生类的共享指针的参数一起使用
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 类模板参数扣除是否可与STD :: MAP一起使用
- 当将 getline 与 int 一起使用时,如何修复"没有重载函数 'getline' 的实例与参数列表匹配"
- 如果与 QProcess 一起传递,则无法识别参数
- 如何将 #ifndef 与宏参数一起使用