【问题标题】:Restricting a range or similar concept to only accept a given type将范围或类似概念限制为仅接受给定类型
【发布时间】:2022-01-09 10:43:39
【问题描述】:

我想声明一个类似于以下的函数:

string concat(const range<string> auto& strings);

我通过以下方式实现了同样的目标:

template <template <typename> typename T> requires range<T<string>>
string concat(const T<string>& strings);

但这对于我来说太沉重和重复了,无法考虑使用。

有没有更清洁的方法?

我假设没有,因为类型概念要求第一个模板参数是常规类型名,这使得给它一个模板参数列表是不可能的。

如果确实不可能,是否有任何计划来弥补这个明显的缺陷?如果不是,是否有任何理由说明这可能难以指定/实施?

【问题讨论】:

    标签: c++ templates c++20 c++-concepts typename


    【解决方案1】:

    可能是这样的:

    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>);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2015-07-15
      • 2022-11-24
      • 2021-12-16
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多