码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++17一个很冷门很有意思的新特性


    最近发现了一个有意思的特性:void_t。

    void_t是C++17引入的一个新特性,它的定义很简单(有些编译器的实现可能不是这样,但也大体类似):

    看着它很简单,但它搭配SFINAE却可以在模板元编程中发挥巨大作用。

    比如在编译期判断类是否有某个类型using:

    1. template <class, class = std::void_t<>>
    2. struct has_type : std::false_type {};
    3. template <class T>
    4. struct has_type<T, std::void_t<typename T::type>> : std::true_type {};

    比如判断是否有某个成员:

    1. template <class, class = std::void_t<>>
    2. struct has_a_member : std::false_type {};
    3. template <class T>
    4. struct has_a_member<T, std::void_t<decltype(std::declval<T>().a)>> : std::true_type {};

    比如判断某个类是否可迭代:

    1. template <typename, typename = void>
    2. constexpr bool is_iterable{};
    3. template <typename T>
    4. constexpr bool is_iterablevoid_t<decltype(std::declval().begin()), decltype(std::declval().end())>> = true;

    比如判断某个类是否有某个函数:

    1. template <class T, class = void>
    2. struct has_hello_func : std::false_type {};
    3. template <class T>
    4. struct has_hello_func<T, std::void_t<decltype(std::declval<T>().hello())>> : std::true_type {};

    测试结果:

    1. struct HasType {
    2. typedef int type;
    3. };
    4. struct NHasType {
    5. int hello;
    6. };
    7. struct Hasa {
    8. int a;
    9. };
    10. struct NHasa {
    11. int b;
    12. };
    13. struct HasHello {
    14. void hello();
    15. };
    16. struct NoHasHello {};
    17. int main() {
    18. std::cout << has_type<HasType>::value << '\n'; // 1
    19. std::cout << has_type<NHasType>::value << '\n'; // 0
    20. std::cout << has_a_member<Hasa>::value << '\n'; // 1
    21. std::cout << has_a_member<NHasa>::value << '\n'; // 0
    22. std::cout << has_hello_func<HasHello>::value << '\n'; // 1
    23. std::cout << has_hello_func<NoHasHello>::value << '\n'; // 0
    24. std::cout << is_iterable<std::vector<double>> << '\n'; // 1
    25. std::cout << is_iterable<double> << '\n'; // 0
    26. }

    它的原理其实就是利用SFINAE和模板优先找特化去匹配的特性,估计大家应该看示例代码就能明白。

    想学习更多C/C++编程内容可以关注哔哩哔哩up主:的个人空间_哔哩哔哩_Bilibili,的主页、动态、视频、专栏、频道、收藏、订阅等。哔哩哔哩Bilibili,你感兴趣的视频都在B站。icon-default.png?t=M85Bhttps://space.bilibili.com/1827181878?spm_id_from=333.1007.0.0

    谢谢你长得这么好看还关注我 俺滴C/C++粉丝群:828339809

    路过了不妨进去看看呗 自学编程不迷路

  • 相关阅读:
    代码整洁之道第四章 注释
    网络工程师进阶课:华为HCIP认证课程介绍
    【Spring事务的实现原理】
    ACL 访问控制 过滤数据 维护网络安全(第七课)
    操作系统备考学习 day6(2.3.2 - 2.3.4)
    [附源码]SSM计算机毕业设计-东湖社区志愿者管理平台JAVA
    8.for循环
    GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案
    vite3 + vue3 异步加载路由后挂载 APP 实例,生产环境下页面空白问题解决
    AWS DynamoDB使用
  • 原文地址:https://blog.csdn.net/yx5666/article/details/126978617
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号