码农知识堂 - 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

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

  • 相关阅读:
    C#拾遗补阙【01】:字符串
    猿创征文 | [云原生]为微服务保驾护航之链路跟踪skywalking保姆级搭建教程
    C++基础入门丨5. 数组——一维数组和二维数组
    【工具】Sublime配置Anaconda的Python环境的简单方法
    【计算机视觉 | 目标检测】目标检测常用数据集及其介绍(七)
    Spring源码:编译及阅读源码入门
    JAVA后台管理系统
    开源框架中的责任链模式实践
    JavaScript入门到精通(五)连载
    解析@Import底层原理
  • 原文地址: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号