網站首頁 編程語言 正文
一、說明
Boost.Parameter 使得將參數作為鍵/值對傳遞成為可能。除了支持函數參數外,該庫還支持模板參數。 Boost.Parameter 在您使用長參數列表并且參數的順序和含義難以記住時特別有用。鍵/值對使得以任何順序傳遞參數成為可能。因為每一個值都是通過一個鍵來傳遞的,所以各種值的含義也更加清晰。
二、示例代碼
示例 53.1。作為鍵/值對的函數參數
#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 定義了一個函數 complicated(),它需要五個參數。參數可以按任何順序傳遞。 Boost.Parameter 提供了宏 BOOST_PARAMETER_FUNCTION 來定義這樣的函數。
在可以使用 BOOST_PARAMETER_FUNCTION 之前,必須定義鍵/值對的參數。這是通過宏 BOOST_PARAMETER_NAME 完成的,它只是傳遞了一個參數名稱。該示例使用 BOOST_PARAMETER_NAME 五次來定義參數名稱 a、b、c、d 和 e。
請注意,參數名稱是在命名空間標記中自動定義的。這應該避免與程序中的同名定義發(fā)生沖突。
定義參數名稱后,BOOST_PARAMETER_FUNCTION 用于定義函數 complicated()。傳遞給 BOOST_PARAMETER_FUNCTION 的第一個參數是返回值的類型。這在示例中是無效的。請注意,類型必須用括號括起來——第一個參數是 (void)。
第二個參數是正在定義的函數的名稱。第三個參數是包含參數名稱的名稱空間。在第四個參數中,訪問參數名稱以進一步指定它們。
在示例 53.1 中,第四個參數以 required 開頭,這是一個使后面的參數成為必需的關鍵字。 required 后跟一對或多對,由參數名稱和類型組成。將類型括在括號中很重要。
各種類型用于參數 a、b、c 和 d。例如,a 可用于將 int 值傳遞給 complicated()。沒有為 e 給出類型。相反,使用星號,這意味著傳遞的值可以具有任何類型。 e 是一個模板參數。
將各種參數傳遞給 BOOST_PARAMETER_FUNCTION 后,定義函數體。像往常一樣,這是在一對大括號之間完成的。可以在函數體中訪問參數。它們可以像變量一樣使用,在 BOOST_PARAMETER_FUNCTION 中分配類型。示例 53.1 將參數寫入標準輸出。
complicated() 是從 main() 調用的。參數以任意順序傳遞給 complicated()。參數名稱以下劃線開頭。 Boost.Parameter 使用下劃線來避免與其他變量名稱沖突。
注意:
要在 C++ 中將函數參數作為鍵/值對傳遞,您還可以使用命名參數習慣用法,它不需要像 Boost.Parameter 這樣的庫。
示例 53.2。可選功能參數
#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 還支持定義可選參數。
在示例 53.2 中,參數 c、d 和 e 是可選的。這些參數使用可選關鍵字在 BOOST_PARAMETER_FUNCTION 中定義。
可選參數的定義類似于必需參數:參數名稱后跟類型。像往常一樣,類型被括在括號中。但是,可選參數需要有默認值。
通過調用 complicated(),僅傳遞參數 a 和 b。這些是唯一需要的參數。由于未使用參數 c、d 和 e,因此將它們設置為默認值。
除了 BOOST_PARAMETER_FUNCTION 之外,Boost.Parameter 還提供宏。例如,您可以使用 BOOST_PARAMETER_MEMBER_FUNCTION 來定義成員函數,并使用 BOOST_PARAMETER_CONST_MEMBER_FUNCTION 來定義常量成員函數。
您可以使用 Boost.Parameter 定義函數,嘗試自動為參數賦值。在這種情況下,您不需要傳遞鍵/值對——只傳遞值就足夠了。如果所有值的類型不同,Boost.Parameter 可以檢測出哪個值屬于哪個參數。這可能需要您對模板元編程有更深入的了解。
示例 53.3。作為鍵/值對的模板參數
#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 將模板參數作為鍵/值對傳遞。與函數一樣,可以按任何順序傳遞模板參數。
該示例定義了一個類 complicated,它需要三個模板參數。因為參數的順序無關緊要,所以它們稱為 A、B 和 C。A、B 和 C 不是訪問類模板時將使用的參數名稱。與函數一樣,參數名稱是使用宏定義的。對于模板參數,使用 BOOST_PARAMETER_TEMPLATE_KEYWORD。示例 53.3 定義了三個參數名稱 integral_type、floating_point_type 和 any_type。
定義參數名稱后,您必須指定可以傳遞的類型。例如,參數 integral_type 可用于傳遞 int 或 long 等類型,但不能傳遞 std::string 等類型。 boost::parameter::parameters 用于創(chuàng)建引用參數名稱的簽名,并定義可以與每個參數一起傳遞的類型。
boost::parameter::parameters 是一個描述參數的元組。必需參數標有 boost::parameter::required。
boost::parameter::required 需要兩個參數。第一個是使用 BOOST_PARAMETER_TEMPLATE_KEYWORD 定義的參數名稱。第二個標識參數可能設置的類型。例如,integral_type 可以設置為整數類型。此要求用 std::is_integral<_> 表示。 std::is_integral<_> 是一個基于 Boost.MPL 的 lambda 函數。 boost::mpl::placeholders::_ 是這個庫提供的占位符。如果將設置了 integral_type 的類型傳遞給 std::is_integral 而不是 boost::mpl::placeholders::_,并且結果為真,則使用有效類型。其他參數 floating_point_type 和 any_type 的要求以類似方式定義。
創(chuàng)建簽名并將其定義為 complicated_signature 后,復雜類將使用它。首先,使用 complicated_signature::bind 將簽名綁定到模板參數 A、B 和 C。新類型 args 表示傳遞的模板參數與模板參數必須滿足的要求之間的聯系。接下來,訪問 args 以獲取參數值。這是通過 boost::parameter::value_type 完成的。 boost::parameter::value_type 期望參數和要傳遞的參數。該參數確定創(chuàng)建的類型。在示例 53.3 中,類 complicated 中的類型定義 integral_type 用于獲取通過參數 integral_type 傳遞給 complicated 的類型。
main() 訪問復雜的實例化類。參數 integral_type 設置為 int,floating_point_type 設置為 double,any_type 設置為 bool。傳遞的參數的順序無關緊要。然后通過 typeid 訪問類型定義 integral_type、floating_point_type 和 any_type 以獲取它們的基礎類型。該示例使用 Visual C++ 2013 編譯,將 int、double 和 bool 寫入標準輸出。
示例 53.4。可選模板參數
#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 介紹了可選的模板參數。簽名使用 boost::parameter::optional 作為可選的模板參數。 complicated 中的可選模板參數設置為 boost::parameter::void_,并且 boost::parameter::value_type 被賦予默認值。此默認值是可選參數將設置為的類型,如果類型未另外設置的話。
complicated 在 main() 中實例化。這次只使用參數 integral_type 和 floating_point_type。 any_type 未使用。該示例使用 Visual C++ 2013 編譯,將 integral_type 的 short、floating_point_type 的 double 和 any_type 的 bool 寫入標準輸出。
Boost.Parameter 可以自動檢測模板參數。您可以創(chuàng)建允許將類型自動分配給參數的簽名。與函數參數一樣,需要對模板元編程有更深入的了解才能做到這一點。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127996950
相關推薦
- 2022-08-15 VPP靜態(tài)映射實現DNAT
- 2022-08-15 linux下一些c語言的知識
- 2022-05-07 Python真題案例之蛇形數組詳解_python
- 2022-06-17 Android啟動頁設置及動態(tài)權限跳轉問題解決_Android
- 2023-11-23 nginx偽靜態(tài)try_files命令解讀
- 2022-04-24 一起來學習C語言的字符串轉換函數_C 語言
- 2023-02-02 redis中的配置以及密碼設置方式_Redis
- 2023-02-10 一文教會你用Python實現pdf轉word_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支