是否可以将概念作为模板参数传递?例如:
我想做这样的事情:
template <typename t, typename u> concept range_of =
range<t> &&
requires (t a) {
{*a.begin()} -> std::same_as<u &>;
};
Run Code Online (Sandbox Code Playgroud)
但我不想给出确切的类型,而是u想给出一个概念:
template <typename t, {{concept u}}> concept constrained_range =
range<t> &&
requires (t a) {
{*a.begin()} -> u;
};
Run Code Online (Sandbox Code Playgroud)
Jea*_*ier 11
由于我们可以将 lambda 函数作为模板参数传递,因此可能会作弊;毕竟,概念只是从类型域到布尔域的元函数。
这是一个例子:
template<auto F, typename T>
using check = std::conditional_t<
F.template operator()<T>()
, std::true_type
, std::false_type>;
#define CONCEPT(TheConcept) \
[] <typename T> () consteval { return TheConcept<T>; }
static_assert(check<CONCEPT(std::floating_point), float>::value);
Run Code Online (Sandbox Code Playgroud)
Godbolt 演示:https://gcc.godbolt.org/z/fGf45nqTc