当前位置:首页 > 技术分析 > 正文内容

C/C++面试题(四):模板元编程和泛型编程

ruisui883个月前 (03-11)技术分析16

模板元编程(Template Metaprogramming, TMP)泛型编程(Generic Programming) 是 C++ 中两个相关但不同的概念。它们都依赖于 C++ 的模板机制,但解决的问题和使用方式有所不同。下面我们来详细解释它们的区别和联系。

1. 泛型编程(Generic Programming)

泛型编程是一种编程范式,旨在编写与具体数据类型无关的通用代码。通过使用模板,泛型编程可以实现代码的复用性和类型安全性。

特点:

  • 目标:编写通用的、可重用的代码。
  • 核心工具:C++ 模板(template)。
  • 典型应用:STL(标准模板库)中的容器(如 std::vector)和算法(如 std::sort)。

示例:

template
T add(T a, T b) {
    return a + b;
}

int main() {
    std::cout << add(3, 4) << std::endl;       // 输出 7
    std::cout << add(3.5, 4.2) << std::endl;  // 输出 7.7
    return 0;
}
  • 这里的 add 函数是一个泛型函数,可以用于任何支持 + 操作的类型。

2. 模板元编程(Template Metaprogramming, TMP)

模板元编程是一种利用 C++ 模板机制在编译期进行计算和代码生成的编程技术。它的核心思想是将计算从运行时转移到编译时,从而生成高效的代码。

特点:

  • 目标:在编译期进行计算、类型操作和代码生成。
  • 核心工具:C++ 模板特化、递归模板、类型萃取(type traits)等。
  • 典型应用:编译期计算、类型推导、代码生成。

示例:

(1)编译期计算

template
struct Factorial {
    static const int value = N * Factorial::value;
};

template<>
struct Factorial<0> {
    static const int value = 1;
};

int main() {
    std::cout << Factorial<5>::value << std::endl; // 输出 120(5!)
    return 0;
}
  • 这里的 Factorial 是一个模板元编程示例,它在编译期计算阶乘。

(2)类型萃取

#include 

template
void print_type() {
    if (std::is_integral::value) {
        std::cout << "Integral type" << std::endl;
    } else {
        std::cout << "Non-integral type" << std::endl;
    }
}

int main() {
    print_type();    // 输出 "Integral type"
    print_type(); // 输出 "Non-integral type"
    return 0;
}
  • 这里使用了 std::is_integral 来检查类型是否为整数类型。

3. 模板元编程 vs 泛型编程

特性

泛型编程(Generic Programming)

模板元编程(Template Metaprogramming)

目标

编写通用的、可重用的代码

在编译期进行计算和代码生成

核心工具

模板(template)

模板特化、递归模板、类型萃取

运行时机

运行时

编译时

典型应用

STL 容器和算法

编译期计算、类型推导、代码生成

代码复杂度

较低

较高

性能

运行时性能

编译期优化,减少运行时开销


4. 模板元编程的实际应用

(1)编译期计算

  • 计算斐波那契数列、阶乘等。
  • 示例:
template
struct Fibonacci {
    static const int value = Fibonacci::value + Fibonacci::value;
};
template<> struct Fibonacci<0> { static const int value = 0; };
template<> struct Fibonacci<1> { static const int value = 1; };

int main() {
    std::cout << Fibonacci<10>::value << std::endl; // 输出 55
    return 0;
}

(2)类型萃取

  • 检查类型特性(如是否为指针、是否为整数等)。
  • 示例:
template
struct IsPointer {
    static const bool value = false;
};
template
struct IsPointer {
    static const bool value = true;
};

int main() {
    std::cout << IsPointer::value << std::endl; // 输出 1(true)
    std::cout << IsPointer::value << std::endl;  // 输出 0(false)
    return 0;
}

(3)代码生成

  • 根据类型生成不同的代码。
  • 示例:
template
void print(T value) {
    if constexpr (std::is_integral_v) {
        std::cout << "Integral: " << value << std::endl;
    } else {
        std::cout << "Non-integral: " << value << std::endl;
    }
}

int main() {
    print(42);       // 输出 "Integral: 42"
    print(3.14);     // 输出 "Non-integral: 3.14"
    return 0;
}

5. 总结

  • 泛型编程 关注的是编写通用的、可重用的代码,主要通过模板实现。
  • 模板元编程 关注的是在编译期进行计算和代码生成,利用模板特化、递归等技术实现。
  • 两者都依赖于 C++ 的模板机制,但解决的问题和使用方式不同。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2700.html

标签: ts void
分享给朋友:

“C/C++面试题(四):模板元编程和泛型编程” 的相关文章

财务未来:数字化全流程自动化报销,让预算管理更轻松

财务管理是企业经营的重中之重,费控管理则是财务管理的核心之一。上至管理层下至普通员工,面对繁琐的费控管理却是“家家有本难念的经”。举个常见的例子:在传统企业的费用管理模式下,员工在进行商务活动时,通常需要自行垫资,之后再经过一系列繁杂的报销审批流程,才能最终实现打款。对于普通员工来说,申报流程繁琐,...

Excel VBA 收费单据打印/一步一步带你设计【收费管理系统】12

本文于2023年6月10日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!☆本期内容概要☆用户窗体设置:收费结算模块设置(7)单据打印大家好,我是冷水泡茶,前几期我们分享了【收费管理系统】的设计,最近一期是(Excel VBA 收费结算模块/一步一步带你设计【收费管理系统】11),...

带你五步学会Vue SSR

作者:liuxuan 前端名狮转发链接:https://mp.weixin.qq.com/s/6K6GUHcLwLG4mzfaYtVMBQ前言SSR大家肯定都不陌生,通过服务端渲染,可以优化SEO抓取,提升首页加载速度等,我在学习SSR的时候,看过很多文章,有些对我有很大的启发作用,有些就只是照搬官...

编码 10000 个小时后,开发者悟了:“不要急于发布!”

【CSDN 编者按】在软件开发的道路上,时间是最好的老师。根据“一万小时定律”,要成为某个领域的专家,通常需要大约一万小时的刻意练习。本文作者身为一名程序员,也经历了一万小时的编程,最终悟出了一个道理:慢即是快,重视架构设计和代码质量,确保每一行代码都经得起时间的考验。作者 | Sotiris Ko...

多项修正 尼康D4s发布最新1.10版固件

尼康公司与2014年8月27日发布了D4s的最新固件,固件版本号为C:1.10。这次固件升级,主要解决了一些BUG,并且对拍摄菜单与相机操作做了一定调整。下面是本次新固件的具体信息:尼康发布D4s最新C固件 1.10版对C固件升级到1.10版所作的修改:当选定运动VR模式并换上 AF-S 尼克尔 4...

微信外H5跳转小程序——组件(vue项目)

场景有个H5(vue项目),需要实现点击商品item跳转到小程序,微信内和微信外都要支持,这里我们只介绍一下H5在微信外的跳转。如图所示,红框内是一个商品,就是点击这里,要跳转小程序:配置微信小程序云开发(云函数)1、开通云开发然后选择免费额度2、云开发权限设置找到权限设置,把这里的「未登录用户访问...