限制范围或类似概念以仅接受给定类型
Restricting a range or similar concept to only accept a given type
我想声明一个类似于以下的函数:
string concat(const range<string> auto& strings);
我通过以下方式实现了同样的效果:
template <template <typename> typename T> requires range<T<string>>
string concat(const T<string>& strings);
但这太冗长和重复了,我不考虑使用。
有没有更简洁的方法?
我假设没有,因为类型概念要求第一个模板参数是常规类型名,这使得给它一个模板参数列表是不可能的。
如果确实不可能,是否有计划来弥补这个明显的缺陷?如果不是,是否有任何理由证明这可能会给 specify/implement 带来麻烦?
可能是这样的:
template <class R, class T>
concept range_of = std::ranges::range<R> &&
std::same_as<std::ranges::range_value_t<R>, T>;
static_assert(range_of<std::vector<int>, int>);
static_assert(range_of<decltype(std::declval<std::vector<int>&>() |
std::views::all),
int>);
我想声明一个类似于以下的函数:
string concat(const range<string> auto& strings);
我通过以下方式实现了同样的效果:
template <template <typename> typename T> requires range<T<string>>
string concat(const T<string>& strings);
但这太冗长和重复了,我不考虑使用。
有没有更简洁的方法?
我假设没有,因为类型概念要求第一个模板参数是常规类型名,这使得给它一个模板参数列表是不可能的。
如果确实不可能,是否有计划来弥补这个明显的缺陷?如果不是,是否有任何理由证明这可能会给 specify/implement 带来麻烦?
可能是这样的:
template <class R, class T>
concept range_of = std::ranges::range<R> &&
std::same_as<std::ranges::range_value_t<R>, T>;
static_assert(range_of<std::vector<int>, int>);
static_assert(range_of<decltype(std::declval<std::vector<int>&>() |
std::views::all),
int>);