0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++17引入的一個新特性void_t簡析

C語言編程 ? 來源:程序喵大人 ? 2023-03-06 09:37 ? 次閱讀

最近發(fā)現(xiàn)了一個有意思的特性:void_t。

void_t是C++17引入的一個新特性,它的定義很簡單(有些編譯器的實現(xiàn)可能不是這樣,但也大體類似):

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

看著它很簡單,但它搭配SFINAE卻可以在模板元編程中發(fā)揮巨大作用。

比如在編譯期判斷類是否有某個類型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;

比如判斷某個類是否有某個函數(shù):

template 
struct has_hello_func : std::false_type {};


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

測試結(jié)果:

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和模板優(yōu)先找特化去匹配的特性,估計大家應(yīng)該看示例代碼就能明白。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48896
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6931

原文標(biāo)題:C++17一個很冷門很有意思的新特性

文章出處:【微信號:C語言編程,微信公眾號:C語言編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    新能源電池產(chǎn)業(yè)鏈及投資機會-磷酸亞鐵鋰

    新能源電池產(chǎn)業(yè)鏈及投資機會-磷酸亞鐵鋰  、前言
    發(fā)表于 12-25 09:34 ?964次閱讀

    35GUI的例子,由

    35GUI的例子,由繁35GUI的例子,由繁,文件里有例子說明以及使用幫助
    發(fā)表于 06-17 18:30

    【設(shè)計技巧】rtos的核心原理

    rtos的核心原理rtos全稱real-time operating system(實時操作系統(tǒng)),我來簡單分析下:我們都知道,c語句中調(diào)用
    發(fā)表于 07-23 08:00

    buck電路和引入電感

    buck電路和引入電感
    發(fā)表于 12-29 08:11

    OpenHarmony智慧設(shè)備開發(fā)-芯片模組T507

    降噪,自動調(diào)色系統(tǒng)和梯形校正模塊可以提供提供流暢的用戶體驗和專業(yè)的視覺效果。 典型應(yīng)用場景: 工業(yè)控制、智能駕艙、智慧家居、智慧電力、在線教育等。 、*附件:OpenHarmony智慧設(shè)備開發(fā)-芯片模組T507.docx
    發(fā)表于 05-11 16:34

    PCB線路板電鍍銅工藝

    PCB線路板電鍍銅工藝   .電鍍工藝的分類:   酸性光亮銅電鍍電鍍鎳/金電鍍錫   二.工藝流程:
    發(fā)表于 11-17 14:01 ?3947次閱讀

    EPON技術(shù)

    EPON技術(shù) EPON是新技術(shù),用于保證提供高品質(zhì)與高帶寬利用率的應(yīng)用。   
    發(fā)表于 01-22 10:43 ?824次閱讀

    鼠標(biāo)HID例程(中)

    鼠標(biāo) HID 例程 緊接《鼠標(biāo) HID 例程(上)》文,繼續(xù)向大家介紹鼠 標(biāo) HID 例程的未完的內(nèi)容。
    發(fā)表于 07-26 15:18 ?0次下載

    C++17 STL標(biāo)準(zhǔn)庫學(xué)習(xí)教材電子書免費下載

    C++11,C++14和C++17標(biāo)準(zhǔn)為C++添加了許多新特性。當(dāng)前的C++已經(jīng)和10年前的
    發(fā)表于 02-28 08:00 ?3次下載
    <b class='flag-5'>C++17</b> STL標(biāo)準(zhǔn)庫學(xué)習(xí)教材電子書免費下載

    5G AAU 功放控制和監(jiān)測模塊

    5G AAU 功放控制和監(jiān)測模塊
    發(fā)表于 10-28 12:00 ?2次下載
    5G AAU 功放控制和監(jiān)測模塊<b class='flag-5'>簡</b><b class='flag-5'>析</b>

    c++入門后如何進(jìn)階

    C++11 是下一個 C++ 標(biāo)準(zhǔn),但我們通常稱之為現(xiàn)代 C++。現(xiàn)代 C++ 也包括了 C++
    發(fā)表于 07-21 08:56 ?281次閱讀
    <b class='flag-5'>c</b>++入門后如何進(jìn)階

    a17和a16的參數(shù)區(qū)別

    哪些重要的區(qū)別呢?本文將一一探討。 1. 內(nèi)核改進(jìn) C++17引入些內(nèi)核改進(jìn),其中最顯著的是對字符串的內(nèi)存使用的優(yōu)化。在C++16的版中,字符串引用傳遞時,會發(fā)生大量的無效副本拷貝
    的頭像 發(fā)表于 08-16 11:47 ?1130次閱讀

    AFE8092幀同步特性

    AFE8092幀同步特性
    的頭像 發(fā)表于 08-24 13:37 ?558次閱讀
    AFE8092幀同步<b class='flag-5'>特性</b><b class='flag-5'>簡</b><b class='flag-5'>析</b>

    C++ invoke與function的區(qū)別在哪?

    invoke是C++17標(biāo)準(zhǔn)引入函數(shù)模板,用來調(diào)用可調(diào)用對象(Callable Object,如函數(shù)指針、函數(shù)對象、成員函數(shù)指針等)并返回結(jié)果。
    的頭像 發(fā)表于 09-04 09:11 ?730次閱讀
    <b class='flag-5'>C</b>++ invoke與function的區(qū)別在哪?

    藍(lán)牙5.4的幾個新特性

    前述文章《藍(lán)牙5.4引入PAwR,電子價簽迎來新機遇》中我們介紹了藍(lán)牙5.4的PAwR特性,該特性引入使得電子價簽領(lǐng)域迎來了新的機遇,但其實藍(lán)牙5.4
    的頭像 發(fā)表于 10-26 17:18 ?3322次閱讀
    藍(lán)牙5.4的幾個新<b class='flag-5'>特性</b>