欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ Boost Parameter超詳細(xì)講解

 更新時(shí)間:2022年11月24日 11:31:48   作者:無(wú)水先生  
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。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ù)的總稱

一、說(shuō)明

Boost.Parameter 使得將參數(shù)作為鍵/值對(duì)傳遞成為可能。除了支持函數(shù)參數(shù)外,該庫(kù)還支持模板參數(shù)。 Boost.Parameter 在您使用長(zhǎng)參數(shù)列表并且參數(shù)的順序和含義難以記住時(shí)特別有用。鍵/值對(duì)使得以任何順序傳遞參數(shù)成為可能。因?yàn)槊恳粋€(gè)值都是通過(guò)一個(gè)鍵來(lái)傳遞的,所以各種值的含義也更加清晰。

二、示例代碼

示例 53.1。作為鍵/值對(duì)的函數(shù)參數(shù)

#include <boost/parameter.hpp>
#include <string>
#include <iostream>
#include <ios>
BOOST_PARAMETER_NAME(a)
BOOST_PARAMETER_NAME(b)
BOOST_PARAMETER_NAME(c)
BOOST_PARAMETER_NAME(d)
BOOST_PARAMETER_NAME(e)
BOOST_PARAMETER_FUNCTION(
  (void),
  complicated,
  tag,
  (required
    (a, (int))
    (b, (char))
    (c, (double))
    (d, (std::string))
    (e, *)
  )
)
{
  std::cout.setf(std::ios::boolalpha);
  std::cout << a << '\n';
  std::cout << b << '\n';
  std::cout << c << '\n';
  std::cout << d << '\n';
  std::cout << e << '\n';
}
int main()
{
  complicated(_c = 3.14, _a = 1, _d = "Boost", _b = 'B', _e = true);
}

Example53.1

示例 53.1 定義了一個(gè)函數(shù) complicated(),它需要五個(gè)參數(shù)。參數(shù)可以按任何順序傳遞。 Boost.Parameter 提供了宏 BOOST_PARAMETER_FUNCTION 來(lái)定義這樣的函數(shù)。

在可以使用 BOOST_PARAMETER_FUNCTION 之前,必須定義鍵/值對(duì)的參數(shù)。這是通過(guò)宏 BOOST_PARAMETER_NAME 完成的,它只是傳遞了一個(gè)參數(shù)名稱。該示例使用 BOOST_PARAMETER_NAME 五次來(lái)定義參數(shù)名稱 a、b、c、d 和 e。

請(qǐng)注意,參數(shù)名稱是在命名空間標(biāo)記中自動(dòng)定義的。這應(yīng)該避免與程序中的同名定義發(fā)生沖突。

定義參數(shù)名稱后,BOOST_PARAMETER_FUNCTION 用于定義函數(shù) complicated()。傳遞給 BOOST_PARAMETER_FUNCTION 的第一個(gè)參數(shù)是返回值的類型。這在示例中是無(wú)效的。請(qǐng)注意,類型必須用括號(hào)括起來(lái)——第一個(gè)參數(shù)是 (void)。

第二個(gè)參數(shù)是正在定義的函數(shù)的名稱。第三個(gè)參數(shù)是包含參數(shù)名稱的名稱空間。在第四個(gè)參數(shù)中,訪問(wèn)參數(shù)名稱以進(jìn)一步指定它們。

在示例 53.1 中,第四個(gè)參數(shù)以 required 開(kāi)頭,這是一個(gè)使后面的參數(shù)成為必需的關(guān)鍵字。 required 后跟一對(duì)或多對(duì),由參數(shù)名稱和類型組成。將類型括在括號(hào)中很重要。

各種類型用于參數(shù) a、b、c 和 d。例如,a 可用于將 int 值傳遞給 complicated()。沒(méi)有為 e 給出類型。相反,使用星號(hào),這意味著傳遞的值可以具有任何類型。 e 是一個(gè)模板參數(shù)。

將各種參數(shù)傳遞給 BOOST_PARAMETER_FUNCTION 后,定義函數(shù)體。像往常一樣,這是在一對(duì)大括號(hào)之間完成的??梢栽诤瘮?shù)體中訪問(wèn)參數(shù)。它們可以像變量一樣使用,在 BOOST_PARAMETER_FUNCTION 中分配類型。示例 53.1 將參數(shù)寫入標(biāo)準(zhǔn)輸出。

complicated() 是從 main() 調(diào)用的。參數(shù)以任意順序傳遞給 complicated()。參數(shù)名稱以下劃線開(kāi)頭。 Boost.Parameter 使用下劃線來(lái)避免與其他變量名稱沖突。

注意:

要在 C++ 中將函數(shù)參數(shù)作為鍵/值對(duì)傳遞,您還可以使用命名參數(shù)習(xí)慣用法,它不需要像 Boost.Parameter 這樣的庫(kù)。

示例 53.2。可選功能參數(shù)

#include <boost/parameter.hpp>
#include <string>
#include <iostream>
#include <ios>
BOOST_PARAMETER_NAME(a)
BOOST_PARAMETER_NAME(b)
BOOST_PARAMETER_NAME(c)
BOOST_PARAMETER_NAME(d)
BOOST_PARAMETER_NAME(e)
BOOST_PARAMETER_FUNCTION(
  (void),
  complicated,
  tag,
  (required
    (a, (int))
    (b, (char)))
  (optional
    (c, (double), 3.14)
    (d, (std::string), "Boost")
    (e, *, true))
)
{
  std::cout.setf(std::ios::boolalpha);
  std::cout << a << '\n';
  std::cout << b << '\n';
  std::cout << c << '\n';
  std::cout << d << '\n';
  std::cout << e << '\n';
}
int main()
{
  complicated(_b = 'B', _a = 1);
}

BOOST_PARAMETER_FUNCTION 還支持定義可選參數(shù)。

在示例 53.2 中,參數(shù) c、d 和 e 是可選的。這些參數(shù)使用可選關(guān)鍵字在 BOOST_PARAMETER_FUNCTION 中定義。

可選參數(shù)的定義類似于必需參數(shù):參數(shù)名稱后跟類型。像往常一樣,類型被括在括號(hào)中。但是,可選參數(shù)需要有默認(rèn)值。

通過(guò)調(diào)用 complicated(),僅傳遞參數(shù) a 和 b。這些是唯一需要的參數(shù)。由于未使用參數(shù) c、d 和 e,因此將它們?cè)O(shè)置為默認(rèn)值。

除了 BOOST_PARAMETER_FUNCTION 之外,Boost.Parameter 還提供宏。例如,您可以使用 BOOST_PARAMETER_MEMBER_FUNCTION 來(lái)定義成員函數(shù),并使用 BOOST_PARAMETER_CONST_MEMBER_FUNCTION 來(lái)定義常量成員函數(shù)。

您可以使用 Boost.Parameter 定義函數(shù),嘗試自動(dòng)為參數(shù)賦值。在這種情況下,您不需要傳遞鍵/值對(duì)——只傳遞值就足夠了。如果所有值的類型不同,Boost.Parameter 可以檢測(cè)出哪個(gè)值屬于哪個(gè)參數(shù)。這可能需要您對(duì)模板元編程有更深入的了解。

示例 53.3。作為鍵/值對(duì)的模板參數(shù)

#include <boost/parameter.hpp>
#include <boost/mpl/placeholders.hpp>
#include <type_traits>
#include <typeinfo>
#include <iostream>
BOOST_PARAMETER_TEMPLATE_KEYWORD(integral_type)
BOOST_PARAMETER_TEMPLATE_KEYWORD(floating_point_type)
BOOST_PARAMETER_TEMPLATE_KEYWORD(any_type)
using namespace boost::parameter;
using boost::mpl::placeholders::_;
typedef parameters<
  required<tag::integral_type, std::is_integral<_>>,
  required<tag::floating_point_type, std::is_floating_point<_>>,
  required<tag::any_type, std::is_object<_>>
> complicated_signature;
template <class A, class B, class C>
class complicated
{
public:
  typedef typename complicated_signature::bind<A, B, C>::type args;
  typedef typename value_type<args, tag::integral_type>::type integral_type;
  typedef typename value_type<args, tag::floating_point_type>::type
    floating_point_type;
  typedef typename value_type<args, tag::any_type>::type any_type;
};
int main()
{
  typedef complicated<floating_point_type<double>, integral_type<int>,
    any_type<bool>> c;
  std::cout << typeid(c::integral_type).name() << '\n';
  std::cout << typeid(c::floating_point_type).name() << '\n';
  std::cout << typeid(c::any_type).name() << '\n';
}

Example53.3

示例 53.3 使用 Boost.Parameter 將模板參數(shù)作為鍵/值對(duì)傳遞。與函數(shù)一樣,可以按任何順序傳遞模板參數(shù)。

該示例定義了一個(gè)類 complicated,它需要三個(gè)模板參數(shù)。因?yàn)閰?shù)的順序無(wú)關(guān)緊要,所以它們稱為 A、B 和 C。A、B 和 C 不是訪問(wèn)類模板時(shí)將使用的參數(shù)名稱。與函數(shù)一樣,參數(shù)名稱是使用宏定義的。對(duì)于模板參數(shù),使用 BOOST_PARAMETER_TEMPLATE_KEYWORD。示例 53.3 定義了三個(gè)參數(shù)名稱 integral_type、floating_point_type 和 any_type。

定義參數(shù)名稱后,您必須指定可以傳遞的類型。例如,參數(shù) integral_type 可用于傳遞 int 或 long 等類型,但不能傳遞 std::string 等類型。 boost::parameter::parameters 用于創(chuàng)建引用參數(shù)名稱的簽名,并定義可以與每個(gè)參數(shù)一起傳遞的類型。

boost::parameter::parameters 是一個(gè)描述參數(shù)的元組。必需參數(shù)標(biāo)有 boost::parameter::required。

boost::parameter::required 需要兩個(gè)參數(shù)。第一個(gè)是使用 BOOST_PARAMETER_TEMPLATE_KEYWORD 定義的參數(shù)名稱。第二個(gè)標(biāo)識(shí)參數(shù)可能設(shè)置的類型。例如,integral_type 可以設(shè)置為整數(shù)類型。此要求用 std::is_integral<_> 表示。 std::is_integral<_> 是一個(gè)基于 Boost.MPL 的 lambda 函數(shù)。 boost::mpl::placeholders::_ 是這個(gè)庫(kù)提供的占位符。如果將設(shè)置了 integral_type 的類型傳遞給 std::is_integral 而不是 boost::mpl::placeholders::_,并且結(jié)果為真,則使用有效類型。其他參數(shù) floating_point_type 和 any_type 的要求以類似方式定義。

創(chuàng)建簽名并將其定義為 complicated_signature 后,復(fù)雜類將使用它。首先,使用 complicated_signature::bind 將簽名綁定到模板參數(shù) A、B 和 C。新類型 args 表示傳遞的模板參數(shù)與模板參數(shù)必須滿足的要求之間的聯(lián)系。接下來(lái),訪問(wèn) args 以獲取參數(shù)值。這是通過(guò) boost::parameter::value_type 完成的。 boost::parameter::value_type 期望參數(shù)和要傳遞的參數(shù)。該參數(shù)確定創(chuàng)建的類型。在示例 53.3 中,類 complicated 中的類型定義 integral_type 用于獲取通過(guò)參數(shù) integral_type 傳遞給 complicated 的類型。

main() 訪問(wèn)復(fù)雜的實(shí)例化類。參數(shù) integral_type 設(shè)置為 int,floating_point_type 設(shè)置為 double,any_type 設(shè)置為 bool。傳遞的參數(shù)的順序無(wú)關(guān)緊要。然后通過(guò) typeid 訪問(wèn)類型定義 integral_type、floating_point_type 和 any_type 以獲取它們的基礎(chǔ)類型。該示例使用 Visual C++ 2013 編譯,將 int、double 和 bool 寫入標(biāo)準(zhǔn)輸出。

示例 53.4??蛇x模板參數(shù)

#include <boost/parameter.hpp>
#include <boost/mpl/placeholders.hpp>
#include <type_traits>
#include <typeinfo>
#include <iostream>
BOOST_PARAMETER_TEMPLATE_KEYWORD(integral_type)
BOOST_PARAMETER_TEMPLATE_KEYWORD(floating_point_type)
BOOST_PARAMETER_TEMPLATE_KEYWORD(any_type)
using namespace boost::parameter;
using boost::mpl::placeholders::_;
typedef parameters<
  required<tag::integral_type, std::is_integral<_>>,
  optional<tag::floating_point_type, std::is_floating_point<_>>,
  optional<tag::any_type, std::is_object<_>>
> complicated_signature;
template <class A, class B = void_, class C = void_>
class complicated
{
public:
  typedef typename complicated_signature::bind<A, B, C>::type args;
  typedef typename value_type<args, tag::integral_type>::type integral_type;
  typedef typename value_type<args, tag::floating_point_type, float>::type
    floating_point_type;
  typedef typename value_type<args, tag::any_type, bool>::type any_type;
};
int main()
{
  typedef complicated<floating_point_type<double>, integral_type<short>> c;
  std::cout << typeid(c::integral_type).name() << '\n';
  std::cout << typeid(c::floating_point_type).name() << '\n';
  std::cout << typeid(c::any_type).name() << '\n';
}

示例 53.4 介紹了可選的模板參數(shù)。簽名使用 boost::parameter::optional 作為可選的模板參數(shù)。 complicated 中的可選模板參數(shù)設(shè)置為 boost::parameter::void_,并且 boost::parameter::value_type 被賦予默認(rèn)值。此默認(rèn)值是可選參數(shù)將設(shè)置為的類型,如果類型未另外設(shè)置的話。

complicated 在 main() 中實(shí)例化。這次只使用參數(shù) integral_type 和 floating_point_type。 any_type 未使用。該示例使用 Visual C++ 2013 編譯,將 integral_type 的 short、floating_point_type 的 double 和 any_type 的 bool 寫入標(biāo)準(zhǔn)輸出。

Boost.Parameter 可以自動(dòng)檢測(cè)模板參數(shù)。您可以創(chuàng)建允許將類型自動(dòng)分配給參數(shù)的簽名。與函數(shù)參數(shù)一樣,需要對(duì)模板元編程有更深入的了解才能做到這一點(diǎn)。

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

相關(guān)文章

  • QT編寫地圖實(shí)現(xiàn)設(shè)備點(diǎn)位的示例代碼

    QT編寫地圖實(shí)現(xiàn)設(shè)備點(diǎn)位的示例代碼

    在地圖應(yīng)用的相關(guān)項(xiàng)目中,在地圖上標(biāo)識(shí)一些設(shè)備點(diǎn),并對(duì)點(diǎn)進(jìn)行交互這個(gè)功能用的最多的,于是需要一套機(jī)制可以動(dòng)態(tài)的添加、刪除、清空、重置。本文將詳細(xì)介紹這些功能如何實(shí)現(xiàn),需要的可以參考一下
    2022-01-01
  • 用C語(yǔ)言實(shí)現(xiàn)2048游戲

    用C語(yǔ)言實(shí)現(xiàn)2048游戲

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(kù)(libbson)方法

    MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(kù)(libbson)方法

    這篇文章主要介紹了安裝?MongoDB?C?驅(qū)動(dòng)程序?(libmongoc)?和?BSON?庫(kù)?(libbson),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++回溯與分支限界算法分別解決背包問(wèn)題詳解

    C++回溯與分支限界算法分別解決背包問(wèn)題詳解

    給定n種物品和一背包。物品i的重量是wi,其價(jià)值為vi,背包的容量為C。問(wèn)應(yīng)如何選擇裝入背包的物品,使得裝入背包中物品的總價(jià)值最大?下面我們分別用回溯與分支限界方法解決
    2022-06-06
  • C++直接cout指針名的含義?

    C++直接cout指針名的含義?

    今天小編就為大家分享一篇關(guān)于C++直接cout指針名的含義?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 徹底掌握C語(yǔ)言strcat函數(shù)的用法

    徹底掌握C語(yǔ)言strcat函數(shù)的用法

    strcat是用來(lái)拼接字符串的,它會(huì)將參數(shù)?src?字符串復(fù)制到參數(shù)?dest?所指的字符串尾部,本章帶你了解它的使用并模擬實(shí)現(xiàn)它
    2022-05-05
  • C語(yǔ)言中傳值與傳指針的介紹與區(qū)別

    C語(yǔ)言中傳值與傳指針的介紹與區(qū)別

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中傳值與傳指針的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • C++標(biāo)準(zhǔn)模板庫(kù)vector的常用操作

    C++標(biāo)準(zhǔn)模板庫(kù)vector的常用操作

    今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)模板庫(kù)vector的常用操作,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C++?setw()函數(shù)的具體使用

    C++?setw()函數(shù)的具體使用

    本文主要介紹了C++?setw()函數(shù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論