0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++17引入的一个新特性void_t简析

C语言编程 来源:程序喵大人 2023-03-06 09:37 次阅读

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

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

template< class... >
using void_t = void;

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

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

template >
struct has_type : std::false_type {};


template 
struct has_type> : std::true_type {};

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

template >
struct has_a_member : std::false_type {};


template 
struct has_a_member().a)>> : std::true_type {};

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

template 
constexpr bool is_iterable{};


template 
constexpr bool is_iterable().begin()), decltype(std::declval().end())>> = true;

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

template 
struct has_hello_func : std::false_type {};


template 
struct has_hello_func().hello())>> : std::true_type {};

测试结果:

struct HasType {
  typedef int type;
};
struct NHasType {
  int hello;
};


struct Hasa {
  int a;
};
struct NHasa {
  int b;
};


struct HasHello {
  void hello();
};
struct NoHasHello {};


int main() {
  std::cout << has_type::value << '
';   // 1
  std::cout << has_type::value << '
';  // 0


  std::cout << has_a_member::value << '
';   // 1
  std::cout << has_a_member::value << '
';  // 0


  std::cout << has_hello_func::value << '
';    // 1
  std::cout << has_hello_func::value << '
';  // 0


  std::cout << is_iterable> << '
';  // 1
  std::cout << is_iterable << '
';               // 0
}

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





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1623

    浏览量

    49108
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6989

原文标题:C++17一个很冷门很有意思的新特性

文章出处:【微信号:C语言编程,微信公众号:C语言编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    新能源电池产业链及投资机会-磷酸亚铁锂

    新能源电池产业链及投资机会-磷酸亚铁锂  、前言
    发表于 12-25 09:34 991次阅读

    35GUI的例子,由

    35GUI的例子,由繁35GUI的例子,由繁,文件里有例子说明以及使用帮助
    发表于 06-17 18:30

    【设计技巧】rtos的核心原理

    rtos的核心原理rtos全称real-time operating system(实时操作系统),我来简单分析下:我们都知道,c语句中调用
    发表于 07-23 08:00

    OpenHarmony智慧设备开发-芯片模组T507

    降噪,自动调色系统和梯形校正模块可以提供提供流畅的用户体验和专业的视觉效果。 典型应用场景: 工业控制、智能驾舱、智慧家居、智慧电力、在线教育等。 、*附件:OpenHarmony智慧设备开发-芯片模组T507.docx
    发表于 05-11 16:34

    PCB线路板电镀铜工艺

    PCB线路板电镀铜工艺   .电镀工艺的分类:   酸性光亮铜电镀电镀镍/金电镀锡   二.工艺流程:
    发表于 11-17 14:01 4021次阅读

    EPON技术

    EPON技术 EPON是新技术,用于保证提供高品质与高带宽利用率的应用。   
    发表于 01-22 10:43 867次阅读

    鼠标HID例程(中)

    鼠标 HID 例程 紧接《鼠标 HID 例程(上)》文,继续向大家介绍鼠 标 HID 例程的未完的内容。
    发表于 07-26 15:18 0次下载

    C++17 STL标准库学习教材电子书免费下载

    C++11,C++14和C++17标准为C++添加了许多新特性。当前的C++已经和10年前的
    发表于 02-28 08:00 7次下载
    <b class='flag-5'>C++17</b> STL标准库学习教材电子书免费下载

    5G AAU 功放控制和监测模块

    5G AAU 功放控制和监测模块
    发表于 10-28 12:00 2次下载
    5G AAU 功放控制和监测模块<b class='flag-5'>简</b><b class='flag-5'>析</b>

    如何理解C++中的void

    首先void*中的void代表任意的数据类型,"星号"代表指针,所以其就是
    的头像 发表于 03-30 15:01 4179次阅读
    如何理解<b class='flag-5'>C</b>++中的<b class='flag-5'>void</b>?

    c++入门后如何进阶

    C++11 是下一个 C++ 标准,但我们通常称之为现代 C++。现代 C++ 也包括了 C++
    发表于 07-21 08:56 342次阅读
    <b class='flag-5'>c</b>++入门后如何进阶

    a17和a16的参数区别

    哪些重要的区别呢?本文将一一探讨。 1. 内核改进 C++17引入些内核改进,其中最显着的是对字符串的内存使用的优化。在C++16的版中,字符串引用传递时,会发生大量的无效副本拷贝
    的头像 发表于 08-16 11:47 1230次阅读

    AFE8092帧同步特性

    AFE8092帧同步特性
    的头像 发表于 08-24 13:37 645次阅读
    AFE8092帧同步<b class='flag-5'>特性</b><b class='flag-5'>简</b><b class='flag-5'>析</b>

    C++ invoke与function的区别在哪?

    invoke是C++17标准引入函数模板,用来调用可调用对象(Callable Object,如函数指针、函数对象、成员函数指针等)并返回结果。
    的头像 发表于 09-04 09:11 821次阅读
    <b class='flag-5'>C</b>++ invoke与function的区别在哪?

    蓝牙5.4的几个新特性

    前述文章《蓝牙5.4引入PAwR,电子价签迎来新机遇》中我们介绍了蓝牙5.4的PAwR特性,该特性引入使得电子价签领域迎来了新的机遇,但其实蓝牙5.4
    的头像 发表于 10-26 17:18 3787次阅读
    蓝牙5.4的几个新<b class='flag-5'>特性</b>