如何在C++17中创建IntegralRange概念并特化整数类型std::pair的calculate函数
实现方案(C++17)
由于C++17没有正式引入concept关键字,我们可以通过类型特性(type traits)+ SFINAE来模拟IntegralRange概念,并实现针对双整数std::pair的函数重载(注:函数模板不支持部分特化,因此用重载替代特化更合理)。
步骤1:定义IntegralRange概念模拟
首先封装一个类型判断逻辑,用来识别“由两个整数类型组成的std::pair”:
#include <utility> #include <type_traits> // 基础模板:默认不匹配IntegralRange template <typename T> struct is_integral_range : std::false_type {}; // 特化模板:仅当T是std::pair且两个成员都是整数类型时匹配 template <typename First, typename Second> struct is_integral_range<std::pair<First, Second>> : std::conjunction<std::is_integral<First>, std::is_integral<Second>> {}; // 简化的常量表达式变量,方便直接使用 template <typename T> constexpr bool is_integral_range_v = is_integral_range<T>::value;
也可以用C++17的constexpr模板变量简化写法:
template <typename T> constexpr bool is_integral_range_v = false; template <typename First, typename Second> constexpr bool is_integral_range_v<std::pair<First, Second>> = std::is_integral_v<First> && std::is_integral_v<Second>;
步骤2:实现针对IntegralRange的函数重载
保留原有的通用模板函数,再新增一个仅匹配IntegralRange类型的重载版本:
// 通用版本:处理所有非IntegralRange的类型 template<typename Range> void calculate(const Range& range) { // 通用逻辑实现 } // 专属版本:仅当Range符合IntegralRange时才会被选中 template <typename Range> std::enable_if_t<is_integral_range_v<Range>> calculate(const Range& range) { // 针对双整数std::pair的专属逻辑 // 示例:获取两个整数成员 auto first = std::get<0>(range); auto second = std::get<1>(range); // ... 后续处理 }
替代方案:直接约束std::pair的重载
如果不需要单独封装is_integral_range,也可以直接在重载中约束std::pair的两个成员类型:
template <typename First, typename Second> std::enable_if_t<std::is_integral_v<First> && std::is_integral_v<Second>> calculate(const std::pair<First, Second>& range) { // 专属逻辑实现 }
但这种方式没有独立的IntegralRange概念,复用性不如第一种方案。
内容的提问来源于stack exchange,提问作者blonded04
相关产品推荐
相关产品推荐

