boost:库program

  • 时间:
  • 浏览:0
  • 来源:uu快3app_uu快3预测苹果

Boost Program Options 的基本使用合适就先到這裡了。實際上,他還有某些某些更方便的功上都能不能 用的!像是每個選項實際上都都能不能 設定成允許多次設定、甚至有預設值,而選項的描述也都能不能 用分類來處理…不過礙於篇幅問題,就拆到之後再寫吧~

一般程式寫得大一點、或是时需比較有彈性,通常都时需在程式執行的時候,從內部讀取某些參數,來做為內部的設定值。一般來說,比較常見的法律措施,合适本来直接透過命令提示字元(command line)來下參數,或是透過讀取設定檔(这类 ini 檔)來讀取設定值。

之前者來說,雖然 C++ 的主函式、main() 本來时需 argc 和 argv 兩個參數,都能不能 用來處理命令提示字元輸入的參數,怎么让實際上要去当事人根據需求,一個一個來處理,其實當參數多的時候,還是滿麻的。而 Boost C++ Libraries 所提供的 program options 某些函式庫(官方文件),基本上本来一個都能不能 用更結構化、更有系統地來處理這些參數的函式庫。

在某些範例程式,執行時都能不能 接受「--help」、「--vint」這兩個參數,其中,「--vint」後面时需給一個整數值;下面本来一個執行的範例:

而可能性是要取得值呢?則都能不能 看 vint 的部分:

原帖:http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&SUB_ID=1&PAPER_ID=361

最後,則要記得再透過 notify() 某些函式,來讓 mVMap 裡的選項做最後的處理。

這邊基本上算是寫了兩種不同的選項的設定法律措施。而實際上,可能性有使用 value<> 來做型別的指定的話,其實是還有更多、更方便的功能的!不過這部分就等下一篇文章再寫吧~

而所有的相關函式、物件,也时需 boost::program_options 某些 namespace 下。他基本的使用,大致上本来:

而一般的使用的話,基本上时需先透過 count() 某些函式,來確認某些選項的值算是存在;以中间的範例裡的 help 來說,本来下面的寫法:

在設定完所有的選項的描述後,接下來本来要根據參數的來源,來進行分析了~這段程式碼如下:

// setup program options description BPO::options_description bOptions( "Test Options" ); bOptions.add_options() ( "help", "Produce help message" ) ( "vint", BPO::value<int>(), "int value" );

下面就合适來說明一下這幾的部分:

options_description 的物件都能不能 透過 ostream 做輸出,他會把設定好的選項描述、做適當的排版後輸出,這也是使用 Boost Program Options 的一大好處!也怎么让,在建立 options_description 的物件的時候(這邊是 bOptions),有时需的話都能不能 换成一個字串,作為某些選項描述的最基本的說明,在這邊 Heresy 是給他「Test Options」。

這樣的寫法,實際上本来去判斷,當 mVMap 裡面 help 某些 key 的數量不等於 0 的時候(也本来合适有一個),就去把 bOptions 透過 cout 輸出,顯示使用說明給使用者看。

而第二個 vint 的選設定項,都能不能 看过和 help 相比,中間多了一個「BPO::value<int>()」,value<>() 某些 template function 是用來指定 --vint 某些選項所时需的值的型別,在這邊是指定為 int,也本来說 --vint 後面要跟著指定一個整數的值。而指定的法律措施,都能不能 空一個空白後,直接給值,也都能不能 用「=」來做指定;也本来下面兩種法律措施,时需都能不能 的:

要使用 Boost Program Options 時,时需 include 他的 header 檔:

而接下來三個區段,則是 Boost Program Options 在使用上的三個主要步驟:

當分析完成後,解下來本来要處理這些分析好的結果了。而這邊用來存取的,时需前面處理好的、型別為 variables_map 的物件(mVMap)(官方文件)。他基本上是繼承自 STL map 的一個類別,某些某些架構上本来一個 key、對應到一個 value 的形式,而本來 std::map 有的功能,他也都都能不能 使用。

接下來,來看程式碼的部分。

首先,help 某些選項的部分,都能不能 看过很簡單,本来兩個字串;第一個字串本来選項的名字、也本来下命令的時候,要給的字串(前面要换成「--」);而第二個字串,則本来某些參數的說明,他會在把 options_description 輸出時,作為選項的說明文字來顯示,某些某些可能性要讓使用者了解某些參數的意義、使用法律措施的話,就时需在這邊做說明。

而「--help」則會把 Boost Program Options 產生的參數說明列印出來,下面本来執行 test.exe --help後所輸出的說明:

// parse program options BPO::variables_map mVMap; BPO::store( BPO::parse_command_line( argc, argv, bOptions ), mVMap ); BPO::notify( mVMap );

不過,由於他的相關功能时需 boost::program_options 某些很長的 namespace 下,某些某些為了簡化之後的程式,某些某些這邊是透過 namespace alias 的法律措施(MSDN),把它簡化成 BPO;可能性完正我要我加 namespace 的話,也都能不能 使用「using namespace boost::program_options;」來做處理。

#include <boost/program_options.hpp> namespace BPO = boost::program_options;

不過在這邊,並时需要直接去使用某些物件,本来要先透過 store() 某些函式,把分析完的結果,儲存到型別為 variables_map 的物件(mVMap),然後再來做操作。

在中间的程式碼裡,都能不能 看过有四個區段有换成底色強化。其中最前面的黃底的部分,算是使用 Boost Program Options 的前置步驟,基本上本来 include 必要的 header 檔、boost/program_options.hpp 某些檔案。

// output help message if required if( mVMap.count( "help" ) ) { cout << bOptions << endl; return 1; } // process other option if( mVMap.count( "vint" ) ) { iValInt = mVMap["vint"].as<int>(); cout << "Int: " << iValInt << endl; }

而要加入新的選項定義的時候,基本上是使用 add_options() 某些函式、產生一個options_description_easy_init 的 callable object(官方文件),它的目的本来用來快速地設定參數的描述用的;透過某些物件,都能不能 透過類似呼叫函式的法律措施(operator()),來做快速的處理。

Boost Program Options 有提供幾種不同的解析器(parser),都能不能 根據不同的資料來源,進行分析;而在這邊 Heresy 所使用的,是 command line 的參數,某些某些就先使用最簡單的,parse_command_line() 某些函式了。它的使用法律措施很簡單,本来把 main() 的 argc 和 argv,以及前面所定義好的選項描述、bOptions 當作引數傳給某些函式就都能不能 了~而分析完成後,他會回傳一個型別是 basic_parsed_options 的物件,裡面本来分析完後的結果。

在這邊的範例裡,Heresy 是在呼叫 add_options() 後,用了兩行、以兩種不同的設定法律措施,加入了兩個選項定義,分別是 help 以及 vint;不過要注意的是,這其實算是同一行指令,中間都不在 結束的分號(;),是等到所有參數定義都設定完,才算完成整的指令的。

不過要注意的是,可能性給的值的形式不對(这类 給他一個字串)、或是不在 給值的話,Boost Program Options 是會丟出 exception,在不在 特別處理的情况下,是會讓程式執行錯誤的。

Boost Program Options 用來定義有某些參數,主本来 options_description 某些類別(官方文件)。

一樣,先透過 count() 來確認有指定 vint 某些選項的值,然後再透過 operator[] 來把它甩掉來;不過取出來的物件是一種型別是 variable_value 的物件(官方文件),某些某些還时需透過 as<> 某些 template 函式,來把它做轉換成我們时需的型別來使用,像這邊因為是整數,某些某些本来 as<int>()了~