最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++模板 index_sequence使用示例詳解

 更新時間:2022年12月07日 16:03:21   作者:amjieker  
這篇文章主要為大家介紹了C++模板 index_sequence使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

integer_sequence 是 c++ 14中新增加的一個元編程工具

其衍生出來的還有如 index_sequencemake_index_sequenceindex_sequence_for等輔助工具

現(xiàn)在,讓我們來淺嘗一下這些東西吧!

integer_sequence

integer_sequence 其實沒有什么特殊的,就是一個類

只不過他是index_sequence的基礎

template<typename _Tp, _Tp... _Idx>
  struct integer_sequence
  {
    typedef _Tp value_type;
    static constexpr size_t size() noexcept { return sizeof...(_Idx); }
  };

index_sequence

index_sequence 會在編譯期生成一個從0開始的序列

然后你就可以對其進行一些奇奇怪怪的操作

template <size_t... N> void print(std::index_sequence<N...>) {
  std::vector<int> res;
  (void)std::initializer_list<int>{
      ((res.push_back(N), std::cout << N << " "), 0)...};
  std::for_each(res.begin(), res.end(), [](int x) {std::cout << x << " ";});
}
int main() {
  auto t = std::make_index_sequence<10>();
  print(t);
  return 0;
}

比如 ((res.push_back(N), std::cout << N << " "), 0)...這句話,就會在編譯期被展開

這里展開在了一個初始化列表中,小技巧

make_index_sequence

那么,index_sequence 是如何生成的呢?

有兩種形式

  • 編譯器內(nèi)建
  • 遞歸式的生成

第二種方式嘛還是用到了元編程的慣用伎倆,特化,遞歸式的編程

template <int... N> struct index_seq {};
template <int N, int... M>
struct make_index_seq : public make_index_seq<N - 1, N - 1, M...> {};
template <int... M> struct make_index_seq<0, M...> : public index_seq<M...> {};

對齊使用也是一樣的形式

template <int... N> void print(index_seq<N...>) {
  (void)std::initializer_list<int>{((std::cout << N << " "), 0)...};
}
int main() {
  auto r = make_index_seq<100>();
  print(r);
  return 0;
}

使用場景

剛才,看見了print去打印的時候打印了 0-(N-1)的元素

那么,這個行為是在編譯期展開的,我們就可以用到其他需要常量的地方

比如一個簡單的需求:

打印tuple!

template <typename T, typename F, int...N>
void exec_for_tuple(const T& tup, F&& func, index_seq<N...>) {
  (void)std::initializer_list<int> {
      (func(std::get<N>(tup)), 0)...
  };
}
template <typename Func, typename ...Arg>
void for_tuple(Func&& func, std::tuple<Arg...> tuple) {
  exec_for_tuple(tuple, std::forward<Func>(func), make_index_seq<sizeof...(Arg)>());
}

exec_for_tuple部分應該非常好懂,但是為什么中間還要再轉(zhuǎn)發(fā)一層呢?

因為tuple元素的個數(shù)我們不能直接獲取到,我們寫的又要是一個通用的函數(shù)

所以要通過 sizeof...(arg) 這種伎倆來將其元素個數(shù)計算出來

如何調(diào)用呢?

如下所示:

std::tuple<int, int, double> tuple{1, 2, 3.0};
for_tuple([](auto t) {
  std::cout << t << " ";
}, tuple);

index_sequence_for

那么,看到現(xiàn)在,你知道 index_sequence_for又是何物嗎?

其實吧,剛才就已經(jīng)見過 index_sequence_for這個東西了

其實就是計算可變長模板參數(shù)的個數(shù),然后將其長度做成一個sequence出來

template<typename... _Types>
using index_sequence_for = make_index_seq<sizeof...(_Types)>;

結語

index_sequence 是一個不起眼的家伙,可能你平時都不會去了解它,但是這個東西的用途還是有很多的,你想想,編譯器制造一串序列的能力,在tuple這種模板中,使用其是不是更加方便了,在bind這種模板中的參數(shù)上,若是使用它,是不是更加靈活好些了。

其實和tuple一個道理,在平常編程中,你也許不會使用它,但是在模板編程中,這是比較好的一個工具。

以上就是C++模板 index_sequence使用示例詳解的詳細內(nèi)容,更多關于C++模板index_sequence的資料請關注腳本之家其它相關文章!

相關文章

  • C++&&Opencv實現(xiàn)控制臺字符動畫的方法

    C++&&Opencv實現(xiàn)控制臺字符動畫的方法

    這篇文章主要介紹了C++&&Opencv實現(xiàn)控制臺字符動畫的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • C++按照正態(tài)分布來排列整型數(shù)組元素

    C++按照正態(tài)分布來排列整型數(shù)組元素

    這篇文章主要介紹了C++按照正態(tài)分布來排列整型數(shù)組元素的相關資料,需要的朋友可以參考下
    2016-07-07
  • C 語言關于聯(lián)合體的相關知識

    C 語言關于聯(lián)合體的相關知識

    這篇文章主要介紹了C 語言關于聯(lián)合體的相關知識,文中講解非常細致,代碼幫助大家更好的理解學習,感興趣的朋友可以了解下
    2020-06-06
  • C語言遞歸系列的深入總結

    C語言遞歸系列的深入總結

    這篇文章主要給大家總結介紹了關于C語言遞歸系列的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • C++中檢查vector是否包含給定元素的幾種方式詳解

    C++中檢查vector是否包含給定元素的幾種方式詳解

    這篇文章主要介紹了C++中檢查vector是否包含給定元素的幾種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C++泛型算法的一些總結

    C++泛型算法的一些總結

    以下是對C++中的泛型算法進行了總結介紹。需要的朋友可以過來參考下
    2013-08-08
  • 使用C語言實現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位

    使用C語言實現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位

    在C語言中,要交換一個整數(shù)的二進制位中的奇數(shù)位和偶數(shù)位,重點需要理解位操作,當我們談論二進制位的奇數(shù)位和偶數(shù)位時,我們是指從右到左數(shù)的位置,本文給大家介紹了使用C語言代碼實現(xiàn)將一個整數(shù)的奇數(shù)位和偶數(shù)位交換,需要的朋友可以參考下
    2025-03-03
  • C語言實現(xiàn)排序算法之歸并排序詳解

    C語言實現(xiàn)排序算法之歸并排序詳解

    這篇文章主要介紹了C語言實現(xiàn)排序算法之歸并排序,對歸并排序的原理及實現(xiàn)過程做了非常詳細的解讀,需要的朋友可以參考下
    2014-07-07
  • Effective C++ 入門學習筆記

    Effective C++ 入門學習筆記

    這篇文章主要介紹了Effective C++ 入門學習筆記,需要的朋友可以參考下
    2023-08-08
  • 淺談哈希表存儲效率一般不超過50%的原因

    淺談哈希表存儲效率一般不超過50%的原因

    下面小編就為大家?guī)硪黄獪\談哈希表存儲效率一般不超過50%的原因。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

开阳县| 开远市| 孝感市| 瑞金市| 古丈县| 林芝县| 柳州市| 白玉县| 马山县| 连江县| 左权县| 丰台区| 武威市| 策勒县| 连州市| 凤庆县| 宁乡县| 栾川县| 临泉县| 林芝县| 无为县| 武定县| 绩溪县| 贡觉县| 宁阳县| 鹿泉市| 禹城市| 曲阳县| 怀来县| 乌鲁木齐县| 平度市| 噶尔县| 新巴尔虎左旗| 嘉鱼县| 四子王旗| 巴青县| 景宁| 象州县| 张家口市| 潮安县| 叶城县|