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

C++?Boost?ScopeExit超詳細講解

 更新時間:2022年11月17日 10:37:36   作者:無水先生  
最近研究了boost中的ScopeExit,發(fā)現(xiàn)是個這是個很高級的特性,可以在作用域結束時自動關閉已經(jīng)打開的資源或做某些清理操作,這篇文章主要介紹了C++?Boost?ScopeExit

一、提要

資源有很多種,每種都封裝一套,還是挺繁瑣的!對于比較少使用或者一個程序很可能只會用一次的資源,我們不想封裝,在這種情況下用Boost.ScopeExit。

二、退出作用域(Boost.ScopeExit)

庫 Boost.ScopeExit 使得在沒有資源特定類的情況下使用 RAII 成為可能。

2.1 范例1.UsingBOOST_SCOPE_EXIT

#include <boost/scope_exit.hpp>
#include <iostream>
int *foo()
{
  int *i = new int{10};
  BOOST_SCOPE_EXIT(&i)
  {
    delete i;
    i = 0;
  } BOOST_SCOPE_EXIT_END
  std::cout << *i << '\n';
  return i;
}
int main()
{
  int *j = foo();
  std::cout << j << '\n';
}

計算結果:

Boost.ScopeExit 提供了宏 BOOST_SCOPE_EXIT,它可以用來定義一些看起來像本地函數(shù)但沒有名字的東西。但是,它確實有一個括號中的參數(shù)列表和大括號中的塊。 必須包含頭文件 boost/scoped_exit.hpp 才能使用 BOOST_SCOPE_EXIT。

宏的參數(shù)列表包含來自外部范圍的變量,這些變量應該可以在塊中訪問。變量通過副本傳遞。要通過引用傳遞變量,它必須以 & 符號作為前綴,如示例2.1 范例1. 中所示。

如果變量在參數(shù)列表中,則塊中的代碼只能從外部范圍訪問變量。

BOOST_SCOPE_EXIT 用于定義一個塊,該塊將在定義塊的范圍結束時執(zhí)行。在示例 3.1 中,使用 BOOST_SCOPE_EXIT 定義的塊在 foo() 返回之前執(zhí)行。

BOOST_SCOPE_EXIT 可用于從 RAII 中受益,而無需使用特定于資源的類。 foo() 使用 new 創(chuàng)建一個 int 變量。為了釋放變量,使用 BOOST_SCOPE_EXIT 定義了一個調(diào)用 delete 的塊。即使函數(shù)由于異常而提前返回,也保證執(zhí)行此塊。在示例 1 中,BOOST_SCOPE_EXIT 與智能指針一樣好。

請注意,變量 i 在 BOOST_SCOPE_EXIT 定義的塊末尾設置為 0。然后 i 由 foo() 返回并寫入 main() 中的標準輸出流。但是,該示例不顯示 0。j 設置為隨機值 - 即 int 變量在內(nèi)存被釋放之前所在的地址。 BOOST_SCOPE_EXIT 后面的塊獲得了對 i 的引用并釋放了內(nèi)存。但由于該塊是在 foo() 的末尾執(zhí)行的,因此將 0 分配給 i 為時已晚。 foo() 的返回值是在 i 設置為 0 之前創(chuàng)建的 i 的副本。

如果您使用 C++11 開發(fā)環(huán)境,則可以忽略 Boost.ScopeExit。在這種情況下,您可以在 lambda 函數(shù)的幫助下使用沒有資源特定類的 RAII。

2.2 示例2.Boost.ScopeExit和C++11的lambda函數(shù)

#include <iostream>
#include <utility>
template <typename T>
struct scope_exit
{
  scope_exit(T &&t) : t_{std::move(t)} {}
  ~scope_exit() { t_(); }
  T t_;
};
template <typename T>
scope_exit<T> make_scope_exit(T &&t) { return scope_exit<T>{
  std::move(t)}; }
int *foo()
{
  int *i = new int{10};
  auto cleanup = make_scope_exit([&i]() mutable { delete i; i = 0; });
  std::cout << *i << '\n';
  return i;
}
int main()
{
  int *j = foo();
  std::cout << j << '\n';
}

運算結果:

示例2 定義了類 scope_exit,其構造函數(shù)接受一個函數(shù)。該函數(shù)由析構函數(shù)調(diào)用。此外,還定義了一個輔助函數(shù) make_scope_exit(),它可以在無需指定模板參數(shù)的情況下實例化 scope_exit。

在 foo() 中,一個 lambda 函數(shù)被傳遞給 make_scope_exit()。 lambda 函數(shù)看起來像示例 3.1 中 BOOST_SCOPE_EXIT 之后的塊:地址存儲在 i 中的動態(tài)分配的 int 變量通過刪除被釋放。然后將 0 分配給 i。

該示例與前一個示例執(zhí)行相同的操作。不僅 int 變量被刪除,而且 j 在寫入標準輸出流時也沒有設置為 0。

2.3 示例3.特點BOOST_SCOPE_EXIT

#include <boost/scope_exit.hpp>
#include <iostream>
struct x
{
  int i;
  void foo()
  {
    i = 10;
    BOOST_SCOPE_EXIT(void)
    {
      std::cout << "last\n";
    } BOOST_SCOPE_EXIT_END
    BOOST_SCOPE_EXIT(this_)
    {
      this_->i = 20;
      std::cout << "first\n";
    } BOOST_SCOPE_EXIT_END
  }
};
int main()
{
  x obj;
  obj.foo();
  std::cout << obj.i << '\n';
}

示例介紹了 BOOST_SCOPE_EXIT 的一些特性:

  • 當 BOOST_SCOPE_EXIT 用于在一個范圍內(nèi)定義多個塊時,這些塊以相反的順序執(zhí)行。示例 3 先顯示后顯示。
  • 如果沒有變量將傳遞給 BOOST_SCOPE_EXIT,則需要指定 void。括號不能為空。
  • 如果您在成員函數(shù)中使用 BOOST_SCOPE_EXIT 并且需要傳遞指向當前對象的指針,則必須使用 this_ 而不是 this。

示例3:顯示first,last, 和20in that order.

三、練習

BOOST_SCOPE_EXIT(&flag) {
} BOOST_SCOPE_EXIT_END

BOOST_SCOPE_EXIT和 BOOST_SCOPE_EXIT_END都是配合著使用的, BOOST_SCOPE_EXIT()里面可以傳入多個參數(shù)。其作用相當于回調(diào)函數(shù),

在作用域結束之后程序會自動調(diào)用 BOOST_SCOPE_EXIT到 BOOST_SCOPE_EXIT_END之間的代碼。

包含的頭文件是 #include <boost/scope_exit.hpp>

下面是一個簡單的例子:

#include  <boost/scope_exit.hpp>
void PrintCout(const std::string& str)
{
    bool submitted = false;
    BOOST_SCOPE_EXIT(&submitted ) {
        if (!submitted)
            std::cout<<"false"<<std::endl;
        else
            std::cout<<"true"<<std::endl;
    } BOOST_SCOPE_EXIT_END
    submitted = ((str == "Y")? true:false);
}
int main(int argc, char* argv[])
{
    std::string str;
    std::cin>>str;
    while(str != "q"){
        PrintCout(str);
        std::cin>>str;
    }
}

這里的 BOOST_SCOPE_EXIT()可以傳入多個參數(shù),格式:

BOOST_SCOPE_EXIT(&parameter1,&parameter2,...)

到此這篇關于C++ Boost ScopeExit超詳細講解的文章就介紹到這了,更多相關C++ Boost ScopeExit內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現(xiàn)LeetCode(79.詞語搜索)

    C++實現(xiàn)LeetCode(79.詞語搜索)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(79.詞語搜索),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++存儲方案和動態(tài)分配

    C++存儲方案和動態(tài)分配

    這篇文章主要介紹了C++存儲方案和動態(tài)分配,
    2021-12-12
  • 基于C++類型重定義的使用詳解

    基于C++類型重定義的使用詳解

    本篇文章是對C++中類型重定義的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • c語言實現(xiàn)把文件中數(shù)據(jù)讀取并存到數(shù)組中

    c語言實現(xiàn)把文件中數(shù)據(jù)讀取并存到數(shù)組中

    下面小編就為大家?guī)硪黄猚語言實現(xiàn)把文件中數(shù)據(jù)讀取并存到數(shù)組中。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 一篇文章帶你了解C++(STL基礎、Vector)

    一篇文章帶你了解C++(STL基礎、Vector)

    這篇文章主要為大家詳細介紹了C++ STL基礎,vector向量容器使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • 用C語言實現(xiàn)簡單的計算器功能

    用C語言實現(xiàn)簡單的計算器功能

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)簡單的計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c++ decltype關鍵字的用法

    c++ decltype關鍵字的用法

    這篇文章主要介紹了c++ decltype關鍵字的用法,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-10-10
  • C語言中的各種文件讀寫方法小結

    C語言中的各種文件讀寫方法小結

    這篇文章主要介紹了C語言中的各種文件讀寫方法小結,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-07-07
  • Qt中QDateTimeEdit的具體使用

    Qt中QDateTimeEdit的具體使用

    本文主要介紹了Qt中QDateTimeEdit的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 詳細分析C++ 信號處理

    詳細分析C++ 信號處理

    這篇文章主要介紹了C++ 信號處理的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論

灌阳县| 彭泽县| 嵩明县| 玉门市| 长沙县| 根河市| 邛崃市| 航空| 鄂温| 大石桥市| 云南省| 拉萨市| 翁牛特旗| 英山县| 巫山县| 舒城县| 淮阳县| 溆浦县| 疏附县| 耿马| 彭水| 张北县| 民丰县| 手机| 玉门市| 峨眉山市| 平利县| 静乐县| 茌平县| 丹凤县| 芦溪县| 彰武县| 武清区| 修武县| 镶黄旗| 利川市| 霸州市| 福贡县| 天峻县| 文昌市| 惠安县|