码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C/C++ 泛型模板约束


    C/C++ 作为 C# 语言的前置版本,ECMA工业化编程语言,自然是存在 “泛型模板约束” 的功能的,只是本文不以 C/C++ 20 新语法搞出来的 “requires” 关键字来实现,它很难用。

    CPP参考:(新标准)

    Constraints and concepts (since C++20) - cppreference.com

    模板对于类型的约束:

    约束 template_get_size 泛型T只允许接受类型:list,其实为 C/C++ 泛型模板例化特性,但与泛型模板例化略微有些区别,因为是带泛型类型约束条件的特例化。

    1. template<typename T>
    2. class list {
    3. public:
    4. int count = 0;
    5. };
    6. template<typename T>
    7. struct template_get_size;
    8. template<typename T>
    9. struct template_get_size > {
    10. inline std::size_t size(list& v) {
    11. return v.count;
    12. }
    13. };
    14. int main(int argc, const char* argv[]) noexcept {
    15. list<int> list_;
    16. list_.count = 100;
    17. template_get_sizeint> > list_get_size_;
    18. printf("%d\n", list_get_size_.size(list_));
    19. return 0;
    20. }

    但,template_get_size 仍然可以尝试编译,从语法层面没有问题,但会编译失败,原因:C/C++ 使用不完整的类型。

    人们无法在编译期间来增加更多检查约束的有效性。

    例一:

    1. template<typename T>
    2. struct template_get_size {
    3.     static_assert(false, "Type constraints of generic templates are violated.");
    4. };

    例二:

    1. template<typename T>
    2. struct template_get_size;
    3. template<typename T>
    4. struct template_get_size {
    5.     static_assert(false, "Type constraints of generic templates are violated.");
    6. };

    上述适用于泛型模板类/结构体,同理泛型模板函数仍可以增加泛型约束,只是没有办法向模板类型一样可以明确的约束T到底需要是什么类型,这取决于模板函数内部的实现,根代码粘合剂差不多,但不意味着不能精确限制那些T类型。

    泛型模板类型例化:

    1. class A {};
    2. class B : public A {};
    3. template<typename T>
    4. class say;
    5. template<>
    6. class say {};

    例如:人们需要T是一个指针,那么有以下几种方法约束:

    案例一:

    1. template<typename T>
    2. void foo(const T* v) {}

    案例二:

    1. template<typename T>
    2. void foo(const T& v) {
    3. typedef typename std::remove_pointer::type element_type;
    4. element_type* p = NULL;
    5. }

    如果:

    人们需要T是一个基类,那么这种似乎不需要模板来实现,如果是模板大约是这样的形式:

    约束T必须是A类或其派生类型,但使用该模板函数的开放人员只有两个途径搞清楚T到底被约束为什么。

    即:1、函数注释上明确T的约束类型,2、查看模板函数的内部实现,不像C#中明确为泛型模板类型 T 增加显示一致性的 where T 约束条件。

    1. class A {};
    2. class B : public A {};
    3. template<typename T>
    4. void foo(const T* v) {
    5. A* a = const_cast(v);
    6. }
    7. int main(int argc, const char* argv[]) noexcept {
    8. B b;
    9. foo(&b);
    10. return 0;
    11. }
    '
    运行

    一个好的建议是:

    每个泛型模板的类型约束都应在类型/函数注释上明确指出,这样使用模板的开发人员不需要尝试预编译代码或阅读模板代码实现来判定模板代码约束条件。

  • 相关阅读:
    leetcode - 03 树专题 450~230~572~208~100~剑指Offer 32~剑指Offer 33
    浅谈矩阵 学习笔记
    Unity-Tilemap 瓦片地图
    springboot+vue基于Spark的共享单车数据存储系统的设计与实现【内含源码+文档+部署教程】
    猿创征文|【HTML】标签学习之路
    Java 基于SpringBoot+Vue的社区医院管理系统的实现
    jQuery提供的获取元素位置的接口方法
    与吴恩达创办Coursera后,她一头扎进数字生物学
    PB转纯BS工具
    郑州直销系统开发为什么需要不断地过滤人?
  • 原文地址:https://blog.csdn.net/liulilittle/article/details/126941932
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号