让我们考虑以下代码:
#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
的第一个模板参数是类型参数。如果不是这种情况,您必须简单地使用长格式语法:a要求子句:
template <template <typename> class Z>
requires M<Z, Concrete_X>
struct C {};
我最初的示例的等效较长形式是:
template <typename T> requires Concept<T>
struct C { };
长形式和短形式的含义相同 - 这里没有功能不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)