Parse command line裡的parameters從來都不是一件簡單的事, 雖然僅僅是字串的解析, 但是沒有一個programmer還想分心去煩惱這些無關緊要的小事, 就像C++的std::string一樣, 簡單有用的設計讓programmer的生活可以輕鬆一點。
使用Java的人應該都對CLI不陌生, 它隸屬於Apache Jakarta Project下的jakarta commons。基本上Boost Program_options做的事情就跟CLI一樣, 所以使用C++的人同樣有方便好用的library可以利用。Java好像比較容易在網路上找到資源, 不管是文件或是程式庫, 都比C++多樣化, 但是Boost出現後慢慢改善了C++的這種情況, 也的確讓很多C++ developer可以更輕鬆的寫程式......離題了
Example:
namespace po = boost::program_options;
po::options_description desc("Available options");
options_description有overload << 這個operator可以output到std::ostream, 也就是說, 我們可以用cout就能印出那一長串的usage information, 格式排版完全不用擔心, 非常方便。
desc.add_options()
("help,h", "help message")
("server,s", "run as server")
("client,c", po::value<string>(),"run as client and connect to the specified IP")
("bind,b", po::value<string>(), "bind a source IP to the client")
("threads,t", po::value<int>(), "the number of concurrent connections")
;
加入選項, 第一個parameter是參數名稱, 用逗號來區分長選項和短選項, 像第一個就是可以接收--help或-h這種選項。當然也可以在選項裡設定要接受使用者輸入參數, 例如上面的--threads或-t可以讓使用者指定thread的個數。
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
再來就是parse command line的字串啦, argc跟argv就是那些熟悉的東西, 全部丟進去就好了, 3行code就搞定!!
if (vm.count("help"))
{
cout << desc << endl;
return 1;
}
variables_map的count方法可以得知有哪些選項出現, 如果使用者想要看help, 那就用cout直接把options_description印出來就好了。if(vm.count("client"))直接取得剛剛已經宣告好型態的參數, 連atoi或是sprintf這些煩人的雜事都省了......
{
string sip = vm["client"].as<string>();
// connect to server...
}
基本用法大概就是這樣, 真的非常簡單, 以後寫command line程式不用再經歷parsing parameter的痛苦了......
1 則留言:
寫的真好...剛好需要^_^
----
Chui-Wen Chiu's Note
http://chuiwenchiu.spaces.live.com
張貼留言