是否可以将概念作为模板参数传递?例如:
我想做这样的事情:
template <typename t, typename u> concept range_of =
range<t> &&
requires (t a) {
{*a.begin()} -> std::same_as<u &>;
};
但我不想给确切的类型u
,而是给它一个概念:
template <typename t, {{concept u}}> concept constrained_range =
range<t> &&
requires (t a) {
{*a.begin()} -> u;
};
答案 0 :(得分:1)
当前无法将概念作为模板参数传递,但是您可以通过传递template template
来解决它:
#include <optional>
template <typename T>
concept Optional = requires {
typename T::value_type;
// ...
};
template <template<typename> typename Q, typename T>
concept OptionalOf = Optional<T> && Q<typename T::value_type>::value;
您可以这样使用(on compiler-explorer):
constexpr bool is_optional_of_int = OptionalOf<std::is_integral, std::optional<int>>;
或者这个:
template <typename T>
struct constrained_range {
static constexpr bool value = range<T> && requires (T a) {
{*a.begin()} -> u;
};
};
constexpr bool is_optional_of_constrained_range = OptionalOf<constrained_range, std::optional<int>>;