C++ type_traits中is_integral的终极使用指南(99%程序员忽略的关键细节)

is_integral, c常量后缀 u -1u = UINT_MAX, 表示无符号 阅读详情

第一章:is_integral 的基本概念与核心作用

类型特征与编译时判断

is_integral 是 C++ 标准库中定义在 <type_traits> 头文件里的一个模板结构体,用于在编译期间判断某个类型是否为整型。它继承自 std::true_type 或 std::false_type,从而提供布尔值语义的类型信息。 该特性广泛应用于模板元编程中,允许开发者根据类型属性启用或禁用特定函数重载或类特化,提升代码的安全性与通用性。

常见整型类型的判定范围

is_integral 对以下类型返回 true:
  • bool
  • char
  • int
  • long long
  • 各种有符号与无符号整型变体
对于浮点类型(如 float、double)和用户自定义类型,则返回 false。

使用示例与代码实现

// 示例:使用 is_integral 进行类型检查
#include <type_traits>
#include <iostream>

template<typename T>
void check_integral() {
    if (std::is_integral<T>::value) {
        std::cout << "T is an integral type.\n";
    } else {
        std::cout << "T is not an integral type.\n";
    }
}

int main() {
    check_integral<int>();     // 输出:T is an integral type.
    check_integral<float>();   // 输出:T is not an integral type.
    return 0;
}
上述代码通过 std::is_integral<T>::value 在编译期获取布尔结果,并据此控制运行时行为。这种模式常用于泛型库的设计中,确保操作仅对合法类型生效。

标准支持情况对照表

类型std::is_integral::value
inttrue
unsigned longtrue
doublefalse
enumtrue(若底层类型为整型)

第二章:is_integral 的底层原理剖析

2.1 is_integral 的模板特化机制详解

`is_integral` 是 C++ 标准库中类型特征(type traits)的重要组成部分,用于判断一个类型是否为整型。其实现依赖于模板的偏特化机制。
基础模板定义
template<typename T>
struct is_integral {
    static constexpr bool value = false;
};
该基础模板默认返回 `false`,表示非整型类型。
特化实现整型识别
对每种整型进行显式特化:
template<> struct is_integral<int>        { static constexpr bool value = true; };
template<> struct is_integral<bool>       { static constexpr bool value = true; };
template<> struct is_integral<char>       { static constexpr bool value = true; };
// 其他整型...
通过为 `int`、`char`、`bool` 等类型提供特化版本,`value` 被设为 `true`,实现精确类型判断。
  • 模板特化允许针对特定类型定制行为
  • 编译期常量 `value` 支持 SFINAE 和 `constexpr` 分支

2.2 常见内置整型类型的匹配规则分析

在多数编程语言中,内置整型类型的匹配遵循明确的字节长度与符号性规则。以Go语言为例,常见类型包括 int8、int16、int32、int64 及其无符号变体。
类型匹配优先级
当进行赋值或运算时,编译器依据类型宽度和符号性自动推导兼容性:
  • 相同宽度的有符号与无符号类型不直接兼容
  • 小宽度类型可隐式提升为大宽度类型
  • 常量表达式可能默认使用 int 类型
代码示例与分析

var a int32 = 100
var b int64 = a // 编译错误:不能隐式转换
var c int64 = int64(a) // 正确:显式转换
上述代码表明,即使 int32 的值在 int64 范围内,仍需显式转换,体现强类型语言的安全设计原则。

2.3 cv限定符(const/volatile)对判断的影响

在类型特征检测中,`const` 和 `volatile`(cv限定符)会显著影响类型的等价性判断。即使基础类型相同,附加的cv限定也会导致类型被视为不同。
cv限定符的类型区分
例如,在 `std::is_same_v` 判断中:
std::is_same_v<int, const int>        // false
std::is_same_v<int, volatile int>     // false
std::is_same_v<const int, const int>  // true
尽管底层均为 `int`,但 `const` 的有无直接改变类型身份,导致元编程中条件分支变化。
去除限定符的常用方法
使用 `std::remove_const_t` 或 `std::remove_cv_t` 可剥离限定:
using T1 = const int;
using T2 = std::remove_const_t<T1>;  // int
static_assert(std::is_same_v<T2, int>);
此操作常用于模板泛化处理,确保类型匹配不受修饰影响。

2.4 与C++类型系统中其他trait的协作关系

在C++类型系统中,`const`、`volatile`、引用和指针等类型修饰符与类型trait(如 `std::is_const`、`std::is_reference`)共同构成元编程的基础。它们通过SFINAE或`constexpr if`影响模板实例化路径。
常见trait协作示例
template <typename T>
void analyze() {
    if constexpr (std::is_const_v<std::remove_reference_t<T>>) {
        // 处理const引用类型
    }
    if constexpr (std::is_lvalue_reference_v<T>) {
        // 区分左值引用
    }
}
上述代码利用`std::remove_reference_t`剥离引用后检测const属性,再单独判断引用类别,实现多维度类型分类。
trait组合使用场景
  • std::is_pointer 与 std::is_function 联用判断函数指针
  • std::is_integral 配合 std::enable_if_t 约束模板参数

2.5 编译期布尔常量值的实现原理探究

在现代编译器设计中,布尔常量的求值往往在编译期完成,以提升运行时效率。编译器通过常量折叠(Constant Folding)技术,在语法树遍历阶段识别布尔字面量和纯表达式,并直接计算其结果。
常量折叠示例
// 示例:布尔表达式在编译期被优化
const (
    A = true
    B = false
    C = A && !B  // 编译期计算为 true
)
上述代码中,C 的值在编译期即被确定为 true,无需运行时计算。编译器在类型检查后阶段对常量表达式进行递归求值,若操作数均为已知常量,则直接替换为结果。
实现机制分析
  • 词法分析阶段识别 true 和 false 为布尔字面量;
  • 语法树构建后,语义分析器标记常量表达式节点;
  • 常量传播与折叠阶段执行逻辑运算并替换子树。

第三章:典型应用场景实战

3.1 函数模板中整型参数的条件分支控制

在C++函数模板中,整型非类型模板参数可用于编译期条件分支控制,实现静态多态。通过 constexpr 和 if-constexpr 结合模板特化,可在编译时决定执行路径。
编译期条件判断示例
template<int N>
void process() {
    if constexpr (N > 0) {
        std::cout << "正数分支\n";
    } else if constexpr (N == 0) {
        std::cout << "零分支\n";
    } else {
        std::cout << "负数分支\n";
    }
}
上述代码中,N 为整型模板参数,if constexpr 在编译期求值,仅保留匹配分支的代码,消除运行时开销。
典型应用场景对比
场景参数值启用分支
日志级别控制1调试输出
算法优化开关0关闭额外检查

3.2 类模板特化中基于整型类型的优化策略

在C++模板编程中,针对整型类型进行类模板特化可显著提升性能。通过为常见整型(如 int、size_t)提供专用实现,编译器可在编译期选择最优路径,避免通用版本的冗余计算。
特化示例与性能对比
template <typename T>
struct Processor {
    static void process(T value) { /* 通用实现 */ }
};

template <>
struct Processor<int> {
    static void process(int value) { 
        // 针对int的位运算优化
        value <<= 1; 
    }
};
上述代码中,int 特化版本使用左移替代乘法,提升执行效率。通用版本适用于所有类型,而特化版本在类型匹配时优先实例化。
适用场景分析
  • 高频调用的数学运算
  • 内存对齐敏感的数据结构
  • 编译期可确定的类型分支

3.3 配合enable_if实现安全的重载决策

在C++模板编程中,多个重载函数可能因类型匹配产生歧义。通过std::enable_if可以基于类型特征控制函数的参与重载决议,从而避免冲突。
基本用法
template<typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type
process(T value) {
    // 仅当T为整型时此函数参与重载
}

template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, void>::type
process(T value) {
    // 仅当T为浮点型时生效
}
上述代码利用std::is_integral和std::is_floating_point作为条件,使不同特性的类型调用对应的重载版本。
优势与场景
  • 消除二义性:确保每种类型只匹配一个最优重载
  • 提升编译期安全性:不满足条件的类型不会进入候选集
  • 支持SFINAE机制:替换失败不会导致编译错误

第四章:常见误区与性能陷阱

4.1 误判非标准整型(如size_t、wchar_t)的风险

在跨平台开发中,误判非标准整型的底层表示可能导致严重缺陷。例如,size_t 在32位系统上通常为unsigned int,而在64位系统上为unsigned long long,直接将其当作int处理会引发截断错误。
常见易混淆类型对比
类型典型宽度(32位)典型宽度(64位)
size_t4字节8字节
wchar_t2字节(Windows)4字节(Linux)
代码示例与风险分析
void process(size_t len) {
    if (len < 0) return; // 永远不成立:size_t 无符号
    int n = len; // 64位下可能截断
}
上述代码中,len < 0 的判断逻辑无效,因为size_t是无符号类型。同时将size_t赋值给int可能导致数据截断,尤其在处理大尺寸缓冲区时极易引发缓冲区溢出。

4.2 枚举类型是否被正确识别的深度解析

在类型系统处理中,枚举类型的识别常因语言特性或序列化机制差异而出现偏差。特别是在跨平台数据交互时,枚举值可能被误判为原始整型或字符串。
常见识别问题场景
  • JSON反序列化时将枚举映射为int而非枚举实例
  • 反射机制未正确获取枚举字段的元数据
  • ORM框架忽略枚举类的自定义序列化逻辑
代码示例与分析
type Status int

const (
    Pending Status = iota
    Approved
    Rejected
)

// MarshalJSON 实现自定义序列化
func (s Status) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf("\"%s\"", s.String())), nil
}
上述Go代码通过实现MarshalJSON方法确保枚举值以字符串形式输出,避免被识别为数字。该机制在API响应中尤为关键,能提升可读性与兼容性。
类型校验建议
使用静态分析工具提前检测枚举类型映射异常,结合单元测试验证序列化一致性。

4.3 SFINAE上下文中使用is_integral的潜在问题

在SFINAE(Substitution Failure Is Not An Error)机制中,std::is_integral 常用于类型约束,但其静态判断特性可能导致模板匹配意外失败。
常见误用场景
当结合enable_if进行条件启用时,若未正确嵌套value成员,会导致编译错误:
template<typename T>
typename std::enable_if<std::is_integral<T>, T>::type
add(T a, T b) { return a + b; }
上述代码遗漏::value,导致enable_if接收一个类型而非布尔值,触发SFINAE失效。正确写法应为:
typename std::enable_if<std::is_integral<T>::value, T>::type
推荐实践
  • 始终检查is_integral::value的布尔结果
  • 优先使用constexpr if(C++17起)替代复杂SFINAE逻辑
  • 结合std::enable_if_t简化语法

4.4 模板元编程中的冗余实例化开销规避

在模板元编程中,相同模板参数的重复实例化会带来编译时间和内存的显著开销。编译器可能为同一类型生成多份完全相同的模板代码,造成冗余。
惰性实例化与特化优化
通过显式特化或偏特化,可避免通用模板对已知类型的重复推导:
template<typename T>
struct Compute { 
    static constexpr int value = T::value * 2; 
};

template<>
struct Compute<int> { 
    static constexpr int value = 42; 
};
上述代码中,Compute<int> 的特化避免了对 int 类型的复杂计算路径,直接提供常量结果,减少实例化深度。
实例化守卫模式
使用 SFINAE 或 if constexpr 可提前排除无效或重复分支:
  • 利用 std::enable_if_t 过滤类型条件
  • 通过 if constexpr (std::is_arithmetic_v<T>) 剪枝逻辑路径
这些技术有效降低模板爆炸风险,提升编译效率。

第五章:未来演进与类型特征设计哲学

类型系统的可扩展性设计
现代编程语言在类型系统设计上趋向于支持更高程度的可扩展性。以 Go 语言为例,通过接口和泛型的结合,开发者可以在不破坏现有代码的前提下引入新类型:

// 定义可比较类型的泛型函数
func Map[K comparable, V any](m map[K]V, fn func(V) V) map[K]V {
    result := make(map[K]V)
    for k, v := range m {
        result[k] = fn(v)
    }
    return result
}
该模式允许在运行时保持类型安全的同时,实现逻辑复用。
领域驱动的类型建模实践
在金融系统开发中,使用强类型区分金额与普通浮点数可有效避免精度误用:
类型名底层类型用途说明
Moneyint64(单位:分)表示精确货币值
Ratefloat64表示利率比例
编译期验证与类型约束
Rust 的 trait 系统通过编译期约束确保资源安全。例如,Send 和 Sync trait 控制跨线程的数据传递行为,防止数据竞争。
  • 所有拥有所有权的类型默认实现 Send
  • 引用类型仅在满足 Sync 时才可共享
  • 自定义类型可通过手动实现 trait 调整行为
类型推导流程: 表达式输入 → 类型标注匹配 → 泛型约束检查 → 编译器推断 → 错误反馈或通过
TypeScript 在大型前端项目中利用字面量类型与联合类型构建精确的 API 契约,显著降低接口误用率。
C++函数模板实战:从崩溃max到工业级日志系统 函数模板是C++类型系统与编译期计算能力的核心交汇点,其本质并非语法糖,而是实现类型安全、零开销泛型的关键机制。它通过模板参数推导、SFINAE、constexpr if等特性,在编译期为不同数据类型生成最优机器码,支撑高性能序列化、无虚函数类型擦除及向量化运算等关键场景。本文聚焦函数模板的工程落地,深入剖析模板参数推导冲突、自定义类型比较缺失、日志零开销开关等真实痛点,并以max函数演进、类型安全日志、碰撞检测重构为线索,展现如何用可变参数模板、std::common_type、ADL规避与折叠表达式构建 阅读详情

相关推荐

C++高级编程实战:从RAII到无锁并发,构建工业级软件核心技能

C++作为高性能系统开发的核心语言,其高级编程范式与工程实践是构建健壮、高效软件的关键。从资源管理的RAII原则出发,通过智能指针实现所有权的清晰界定与异常安全,这是现代C++工程化的基石。深入理解移动语义与完美转发,能有效消除不必要的对象拷贝,显著提升程序性能,尤其在容器操作与工厂模式中价值巨大。在多核时代,掌握C++内存模型与原子操作,是编写正确并发代码的前提,而基于CAS的无锁数据结构设计,则为极致性能场景提供了解决方案。这些技术共同指向一个目标:在复杂工程实践中,实现内存安全、线程安全与高性能的平衡

cmff98425的博客 416

C/C++编程:std::is_integral

std::is_integral #include <iostream> #include <type_traits> // class A{}; enum E: int {}; // 改写:如何反推出模板参数的类型名字 ??? template<class T> void f(T i){ if(!std::is_integral<T>::value){ printf("%s ", "Integral required.\n")

OceanStar的博客 3268

C++模板与STL:从泛型编程到工程实践的核心指南

泛型编程是C++支持大规模软件工程的核心范式,它通过编写与类型无关的通用代码来解决代码复用问题。其原理基于模板元编程,编译器在编译时根据具体类型生成特化代码,实现了静态多态。这一技术的核心价值在于提升开发效率、保证类型安全并优化性能,是构建可复用、高性能库的基础。在实际应用场景中,标准模板库(STL)作为泛型编程最成功的实践,提供了经过千锤百炼的通用容器(如vector、map)和算法(如sort、find)。这些组件通过迭代器解耦,实现了数据结构和算法的独立演化,广泛应用于系统软件、游戏引擎、高频交易等对

weixin_30896825的博客 606

【C++ 泛型编程 入门篇】全面掌握C++元模板中的模板继承:模板继承深入指南和教程

在C++中,继承通常是面向对象编程的一个特性,用于创建基于现有类的新类。然而,这个概念也可以应用于模板。通过模板继承,我们可以创建一个基于现有模板的新模板,并且可以为新模板添加或覆盖特定的功能。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1987

电子设计实战:用MOS管手把手搭建D触发器电路(含时序分析避坑指南)

本文详细介绍了如何使用MOS管从零开始搭建D触发器电路,重点解析了建立时间和保持时间等关键时序参数对电路稳定性的影响。通过实测波形分析和避坑指南,帮助电子工程师掌握D触发器的实际搭建技巧与优化方法,提升数字电路设计的可靠性。

x1y2z的博客 1162

阿里云百炼平台创建智能体-上传文档

阿里云百炼智能体-上传文档文件

weixin_43930851的博客 1356

C++标准模板(STL)- 类型支持 (类型特性,is_void,is_null_pointer,is_integral)

类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。 试图特化定义于 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。 定义于头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。

qq_40788199的博客 478

[QMT和ptrade量化交易小白入门]-112、小市值热点概念交易策略,回测5年20倍

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1080

語言/CPP {is_integral,conditional}

1

qq_66485519的博客 130

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

2026年华为OD机试真题 新系统【点亮战争迷雾】

华为OD机试真题 8月18号 新系统【点亮战争迷雾】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【点亮战争迷雾】多语言题解。

qq_45776114的博客 494

is_integral 实现原理曝光,99% 的开发者都忽略的关键细节

深入解析type_traits的is_integral实现原理,揭示99%开发者忽略的关键细节。涵盖SFINAE、模板特化等核心技术,适用于类型萃取与编译期判断场景,提升代码安全性与泛型设计能力。值得收藏

InstrIsle的博客 298

基于STM32、HAL库的ADE7880ACPZ-RL电能计量芯片驱动程序设计

@retval 状态 (ADE7880_OK或ADE7880_ERROR)* @retval 状态 (ADE7880_OK或ADE7880_ERROR)* @retval 状态 (ADE7880_OK或ADE7880_ERROR)* @retval 状态 (ADE7880_OK或ADE7880_ERROR)* @retval 状态 (ADE7880_OK或ADE7880_ERROR)PA6 (MISO) <--> SDO (SPI数据输出)PB0 (CS) <--> /CS (片选,低有效)

corlin6688的博客 668

C++编译期分支实现:从SFINAE到概念(Concepts)的四种方法对比

在C++模板元编程中,编译期分支是实现零开销抽象的核心技术。其原理基于编译器的模板实例化规则,通过条件判断在编译时选择不同的代码路径,从而消除运行时条件跳转的开销。这项技术的价值在于为性能敏感场景提供极致优化,广泛应用于数学计算库、序列化框架和游戏引擎等领域。常见的实现方法包括SFINAE、标签分发、if constexpr和概念(Concepts),每种方法各有其适用场景和优缺点。本文通过对比这四种主流技术,帮助开发者根据项目需求选择最合适的编译期分支方案,提升代码性能和可维护性。

weixin_33770878的博客 510

K230在原有LVGL控件触摸屏控制的基础上,增加USB鼠标控制!

搭配CanMV图形化编程,中小学生可快速开发“键鼠控制AI小游戏”“智能画板”等趣味项目,降低AI学习门槛;:HDMI屏幕+键鼠组合,直接在开发板上调试代码、修改ISP参数、查看AI推理日志,无需频繁连接电脑;:打造带交互的AI设备(如工业控制面板、智能显示器),鼠标操作菜单、键盘输入指令,体验媲美小型PC;:无网络场景下,通过键盘直接向AI设备录入数据、配置参数,适配野外监测、本地工控等场景。,自动识别、快速响应,完美适配交互控制、参数调试、数据输入等场景。

weixin_47446386的博客 146

从零到多智能体:Google Agent开发套件(ADK)入门指南

ADK促进自定义工具生产的能力是其优势之一。本质上,工具只是一个带有描述性文档字符串的Python函数。

独立开发,substack顶级编辑 2491

C++内存管理与模板编程:从RAII到泛型容器的实战指南

内存管理是编程语言中确保程序稳定性和效率的核心机制,它涉及内存的分配、使用和释放。在C++中,程序员通过new/delete等操作直接控制内存,但这也带来了内存泄漏、悬空指针等风险。RAII(资源获取即初始化)是解决这一问题的关键思想,它将资源生命周期与对象绑定,实现自动管理。基于RAII的智能指针(如unique_ptr、shared_ptr)是现代C++管理动态内存的标准工具,能有效防止资源泄漏。泛型编程通过模板技术实现,允许编写与类型无关的代码,提升代码复用性和抽象能力。模板通过类型参数化,支持函数模

weixin_33859844的博客 314

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++模板元编程递归终止条件设计:从原理到实战避坑指南

模板元编程是C++在编译期执行计算的强大技术,其核心机制依赖于模板的递归实例化。理解其原理,关键在于掌握如何通过模板特化或偏特化来定义递归规则,并在特定条件下终止递归,从而避免编译器陷入无限循环。这项技术的价值在于能够实现类型安全的高性能代码,例如在数学库、序列化框架或容器库中进行编译期优化和类型分发。在实际应用中,递归终止条件的设计模式多样,包括基于参数数值递减至边界、检测类型参数包是否为空、利用SFINAE机制或C++17的if constexpr进行条件分支。本文聚焦于**递归终止条件**这一核心主题

weixin_30918633的博客 403

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

看完这个你还不理解右值引用和移动构造 你就可以来咬我(下)

共分三篇,这是第一篇。另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(上),看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)。 下面是新标准下的其他特性(共十点),了解一下,总有用上的时候。 C++11 新特性分析 auto 现在是一种类型占位符,它会告诉编译器,应该从初始化式中推断出变量的实际类型。当你想在不同的作用域中(

yapian8的专栏 3911

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

元编程: is_integral<Tp>

判断类型是否为整型, 注意,布尔类型也是整型 #include <iostream> #include <functional> #include <type_traits> using namespace std; int int_print() { return 0; } void void_print() { } class A { public: A() { a = 10; } int int

hit1524468的专栏 537

C++模板元编程核心技巧(is_integral 类型判断全攻略)

掌握C++模板元编程核心技巧,深入解析type_traits 的 is_integral类型判断机制。涵盖整型检测适用场景、SFINAE原理应用与编译期优化优势,提升泛型代码安全性与效率,值得收藏。

ProceChat的博客 291

【C++类型 Traits 深度解析】:揭秘 is_integral 如何精准判断整型类型

掌握C++类型判断利器,解析type_traits的is_integral如何精准识别整型类型。适用于模板元编程与静态断言,通过特化机制实现编译期判断,提升代码安全性与通用性,值得收藏

CodeWhim的博客 338

C++【type traits】 | 基本使用

文章目录一、助手类1、integral_constant2、true_type和false_type二、主要类型特征1、主要类型类别is_array:是数组is_class:是非联合类is_enum:是枚举is_floating_point:是浮点数is_function:是函数is_integral:是不可分割的is_lvalue_reference:是左值引用is_member_function_pointer:是成员函数指针is_member_object_pointer:是成员对象指针is_poin

weixin_45926547的博客 2317

c++11新特性std::is_trivial

首先 std::is_trivila 定义: template< class T > struct is_trivial; 结构成员函数: value 返回true,如果T 包含默认的构造函数。 其他情况下,返回false。 一种可能的实现方式: template< class T > struct is_trivial : std::integral_constant&...

TH_NUM的博客 5879

【C++】C++11新增关键字详解

一、auto 1、auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2、auto用于推断变量类型示例(C++11) auto i = 42; //i is an int auto l = 42LL; //l is an long long auto p = new foo(); //p is a foo* 3、声明或定义函数时作为函数返回值的占位符,此时需要与关键字 decl...

郭老二 6204

opencv_C++ integral()函数 积分图计算

目录一、积分图原理二、积分图计算:cv::integral() 函数三、代码示例四、结果 一、积分图原理 在积分图像(Integral Image - ii)上任意位置(x, y)处的ii(x, y)表示该点左上角所有像素之和,表示如下: 从给定图像I从上到下、从左到右计算得到和的积分图像公式如下: 其中(x&lt;0 || y&lt;0) 时ii(x,y)=0, i(x,y)=0 积分图像解...

duanbin的博客 6654
上一篇: C++初始化列表顺序之谜:为什么成员变量不按预期初始化?
下一篇: 【STL高手进阶必备】:彻底搞懂lower_bound中的比较器规则与排序依赖
ByteChat
博客等级 码龄1年 157粉丝 1991原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值