" />

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

C++?Boost?Spirit進(jìn)階教程

 更新時(shí)間:2022年11月11日 08:45:56   作者:無(wú)水先生  
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)

一、行動(dòng)

到目前為止,本章中的示例只檢測(cè)到兩件事:解析器是否成功以及解析器在哪里結(jié)束。但是,解析器通常以某種方式處理數(shù)據(jù),正如您將在下一個(gè)示例中看到的那樣。

Example11.9.Linking actions with parsers

#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
using namespace boost::spirit;
int main()
{
  std::string s;
  std::getline(std::cin, s);
  auto it = s.begin();
  bool match = qi::phrase_parse(it, s.end(),
    qi::int_[([](int i){ std::cout << i << '\n'; })], ascii::space);
  std::cout << std::boolalpha << match << '\n';
  if (it != s.end())
    std::cout << std::string{it, s.end()} << '\n';
}

示例 11.9 使用 boost::spirit::qi::int_ 解析一個(gè)整數(shù),然后將該整數(shù)寫(xiě)入標(biāo)準(zhǔn)輸出。這就是為什么一個(gè)動(dòng)作與 boost::spirit::qi::int_ 相關(guān)聯(lián)。動(dòng)作是應(yīng)用解析器時(shí)調(diào)用的函數(shù)或函數(shù)對(duì)象。鏈接是使用運(yùn)算符 operator[] 完成的,它被 boost::spirit::qi::int_ 和其他解析器重載。示例 11.9 使用 lambda 函數(shù)作為操作,該操作需要一個(gè) int 類(lèi)型的唯一參數(shù)并將其寫(xiě)入標(biāo)準(zhǔn)輸出。

如果您啟動(dòng)示例 11.9 并輸入一個(gè)數(shù)字,則會(huì)顯示該數(shù)字。

傳遞給動(dòng)作的參數(shù)類(lèi)型取決于解析器。例如, boost::spirit::qi::int_ 轉(zhuǎn)發(fā)一個(gè) int 值,而 boost::spirit::qi::float_ 傳遞一個(gè) float 值。

Example11.10.Boost.Spirit with Boost.Phoenix

#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <boost/phoenix/phoenix.hpp>
#include <string>
#include <iostream>
using namespace boost::spirit;
using boost::phoenix::ref;
int main()
{
  std::string s;
  std::getline(std::cin, s);
  auto it = s.begin();
  int i;
  bool match = qi::phrase_parse(it, s.end(), qi::int_[ref(i) = qi::_1],
    ascii::space);
  std::cout << std::boolalpha << match << '\n';
  if (match)
    std::cout << i << '\n';
  if (it != s.end())
    std::cout << std::string{it, s.end()} << '\n';
}

示例 11.10 使用 Boost.Phoenix 將使用 boost::spirit::qi::int_ 解析的 int 值存儲(chǔ)在 i 中。如果 boost::spirit::qi::phrase_parse() 返回 true,則將 i 寫(xiě)入標(biāo)準(zhǔn)輸出。

這個(gè)例子在包含來(lái)自 Boost.Spirit 的頭文件之前定義了宏 BOOST_SPIRIT_USE_PHOENIX_V3。此宏選擇 Boost.Phoenix 的第三個(gè)和當(dāng)前版本。這很重要,因?yàn)?Boost.Phoenix 是從 Boost.Spirit 派生的,而 Boost.Spirit 包含 Boost.Phoenix 的第二個(gè)版本。如果未定義 BOOST_SPIRIT_USE_PHOENIX_V3,則 Boost.Phoenix 的第二個(gè)版本將包含在 Boost.Spirit 頭文件中,第三個(gè)版本將包含在 boost/phoenix/phoenix.hpp 中。不同的版本會(huì)導(dǎo)致編譯器錯(cuò)誤。

請(qǐng)注意如何詳細(xì)定義 lambda 函數(shù)。 boost::phoenix::ref() 創(chuàng)建對(duì)變量 i 的引用。但是,占位符 _1 不是來(lái)自 Boost.Phoenix,而是來(lái)自 Boost.Spirit。這很重要,因?yàn)?boost::spirit::qi::_1 提供了對(duì)具有通常預(yù)期類(lèi)型的??解析值的訪問(wèn)——示例 11.10 中的 int。如果 lambda 函數(shù)使用 boost::phoenix::placeholders::arg1,編譯器會(huì)報(bào)錯(cuò),因?yàn)?boost::phoenix::placeholders::arg1 不代表 int;它將基于 Boost.Spirit 中的另一種類(lèi)型,并且需要提取 int 值。

二、屬性

操作是處理解析值的一種選擇。另一種選擇是將對(duì)象傳遞給 boost::spirit::qi::parse() 或 boost::spirit::qi::phrase_parse() 用于存儲(chǔ)解析值。這些對(duì)象稱(chēng)為屬性。它們的類(lèi)型必須與解析器的類(lèi)型相匹配。

您已經(jīng)在上一節(jié)中使用過(guò)屬性。傳遞給動(dòng)作的參數(shù)也是屬性。每個(gè)解析器都有一個(gè)屬性。例如,解析器 boost::spirit::qi::int_ 具有 int 類(lèi)型的屬性。在以下示例中,屬性不會(huì)作為參數(shù)傳遞給函數(shù)。相反,解析后的值存儲(chǔ)在屬性中,可以在 boost::spirit::qi::parse() 或 boost::spirit::qi::phrase_parse() 返回后處理。

Example11.11.Storing anintvalue in an attribute

#include <boost/spirit/include/qi.hpp>
#include <string>
#include <iostream>
using namespace boost::spirit;
int main()
{
  std::string s;
  std::getline(std::cin, s);
  auto it = s.begin();
  int i;
  if (qi::phrase_parse(it, s.end(), qi::int_, ascii::space, i))
    std::cout << i << '\n';
}

示例 11.11 使用解析器 boost::spirit::qi::int_。解析后的 int 值存儲(chǔ)在變量 i 中。 i 作為另一個(gè)參數(shù)傳遞給 boost::spirit::qi::phrase_parse(),因此成為解析器 boost::spirit::qi::int_ 的一個(gè)屬性。 如果您啟動(dòng)示例 11.11 并輸入一個(gè)數(shù)字,該數(shù)字將被寫(xiě)入標(biāo)準(zhǔn)輸出流。

Example11.12.Storing severalintvalues in an attribute

#include <boost/spirit/include/qi.hpp>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
using namespace boost::spirit;
int main()
{
  std::string s;
  std::getline(std::cin, s);
  auto it = s.begin();
  std::vector<int> v;
  if (qi::phrase_parse(it, s.end(), qi::int_ % ',', ascii::space, v))
  {
    std::ostream_iterator<int> out{std::cout, ";"};
    std::copy(v.begin(), v.end(), out);
  }
}

示例 11.12 使用了一個(gè)用 qi::int_ % ',' 定義的解析器。解析器接受由逗號(hào)分隔的任意數(shù)量的整數(shù)。像往常一樣忽略空格。

因?yàn)榻馕銎骺梢苑祷囟鄠€(gè) int 值,所以屬性的類(lèi)型必須支持存儲(chǔ)多個(gè) int 值。該示例傳遞一個(gè)向量。如果您開(kāi)始該示例并輸入多個(gè)以逗號(hào)分隔的整數(shù),則這些整數(shù)將寫(xiě)入以分號(hào)分隔的標(biāo)準(zhǔn)輸出流。

除了向量,您還可以傳遞其他類(lèi)型的容器,例如 std::list。Boost.Spirit 文檔描述了哪些屬性類(lèi)型必須與哪些運(yùn)算符一起使用。

到此這篇關(guān)于C++ Boost Spirit進(jìn)階教程的文章就介紹到這了,更多相關(guān)C++ Boost Spirit內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)2D賽車(chē)游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)2D賽車(chē)游戲的示例代碼

    此游戲是《2D 賽車(chē)》的”魔改版“——2.5D 雙人賽車(chē)!原作實(shí)現(xiàn)了 2D 視角的賽車(chē)游戲,但是我覺(jué)得不夠真實(shí)、操縱感不強(qiáng),故擠出數(shù)個(gè)周末完成了這個(gè)”魔改版“,實(shí)現(xiàn)了第一人稱(chēng)的視角,希望大家喜歡
    2022-12-12
  • C++中的對(duì)象初始化操作代碼

    C++中的對(duì)象初始化操作代碼

    對(duì)象初始化可以分為默認(rèn)初始化、直接初始化、拷貝初始化以及值初始化。本文重點(diǎn)給大家介紹C++中的對(duì)象初始化操作代碼,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • c++實(shí)現(xiàn)高精度加法

    c++實(shí)現(xiàn)高精度加法

    高精度運(yùn)算是指參與運(yùn)算的數(shù)(加數(shù),減數(shù),因子……)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型(整型,實(shí)型)能表示的范圍的運(yùn)算。例如,求兩個(gè)200位的數(shù)的和。這時(shí),就要用到高精度算法了。
    2017-05-05
  • C++中try throw catch異常處理的用法示例

    C++中try throw catch異常處理的用法示例

    這篇文章主要給大家介紹了關(guān)于C++中try throw catch異常處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • C語(yǔ)言代碼實(shí)現(xiàn)三子棋游戲

    C語(yǔ)言代碼實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 探究C++中string類(lèi)的實(shí)現(xiàn)原理以及擴(kuò)展使用

    探究C++中string類(lèi)的實(shí)現(xiàn)原理以及擴(kuò)展使用

    這篇文章主要介紹了C++中string類(lèi)的實(shí)現(xiàn)原理以及擴(kuò)展使用,從內(nèi)存分配角度進(jìn)行了深入探究,需要的朋友可以參考下
    2015-12-12
  • C語(yǔ)言雙向鏈表的原理與使用操作

    C語(yǔ)言雙向鏈表的原理與使用操作

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。本文主要介紹了C語(yǔ)言算法中雙向鏈表的實(shí)現(xiàn),需要的可以參考一下
    2022-05-05
  • 用C語(yǔ)言winform編寫(xiě)滲透測(cè)試工具實(shí)現(xiàn)SQL注入功能

    用C語(yǔ)言winform編寫(xiě)滲透測(cè)試工具實(shí)現(xiàn)SQL注入功能

    本篇文章主要介紹使用C#winform編寫(xiě)滲透測(cè)試工具,實(shí)現(xiàn)SQL注入的功能。使用python編寫(xiě)SQL注入腳本,基于get顯錯(cuò)注入的方式進(jìn)行數(shù)據(jù)庫(kù)的識(shí)別、獲取表名、獲取字段名,最終獲取用戶(hù)名和密碼;使用C#winform編寫(xiě)windows客戶(hù)端軟件調(diào)用.py腳本,實(shí)現(xiàn)用戶(hù)名和密碼的獲取
    2021-08-08
  • short與int轉(zhuǎn)換的小例子

    short與int轉(zhuǎn)換的小例子

    short與int轉(zhuǎn)換的小例子,需要的朋友可以參考一下
    2013-04-04
  • 理解C++編程中的std::function函數(shù)封裝

    理解C++編程中的std::function函數(shù)封裝

    這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標(biāo)準(zhǔn)中的新特性,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

曲沃县| 东明县| 永泰县| 郎溪县| 西吉县| 汨罗市| 五寨县| 西华县| 海晏县| 新民市| 白玉县| 平泉县| 紫金县| 屯门区| 泗阳县| 织金县| 鄂尔多斯市| 福安市| 乐至县| 昭通市| 屏东市| 南投市| 法库县| 海安县| 嘉兴市| 金门县| 绵竹市| 武威市| 玉门市| 疏勒县| 班玛县| 甘泉县| 泸水县| 玉林市| 德令哈市| 菏泽市| 会同县| 汝南县| 普格县| 遵义县| 章丘市|