代码之家  ›  专栏  ›  技术社区  ›  blonded04

类型的概念,用于检查类是否是一个指定的模板类,该模板类由满足另一个概念的类型参数化

  •  1
  • blonded04  · 技术社区  · 2 年前

    假设我在C++17中有一个函数:

    template<typename Range> void calculate(const Range& range) { /* do something */ }
    

    我想把它专门化为所有成对的积分类型( std::pair<std::integral, std::integral> ),我想创建一个单独的概念 IntegralRange 为了它:我该如何实现它?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Jan Schultke    2 年前

    将功能专门化用于此目的是不可能的;我想你的意思是超载。您可以通过提供第二个过载来解决此问题:

    template<std::integral First, std::integral Second>
    void calculate(std::pair<First, Second> range) { /* do something */ }
    

    或者,如果你坚持使用一个概念:

    template <typename T>
    concept integral_pair = requires (T pair) {
        []<std::integral First, std::integral Second>(std::pair<First, Second>){}(pair);
    };
    
    void calculate(integral_pair auto range) { /* do something */ }
    

    这个 requires 表达式使用立即调用的lambda表达式(IILE)来确保 First Second 可以从 pair .