2013-07-22 36 views
1

我正在使用boost::program_options來解析命令行參數。我希望我的程序能夠將輸入的參數回顯給用戶進行驗證。這聽起來像一個簡單的任務,但我無法找到一個優雅的解決方案。Echo在Boost中輸入命令行參數

問題是用戶可以輸入各種數據類型(字符串,整數,布爾值等)。通常這是通過提升很好地處理。但我有麻煩將這些值重新輸入到字符串中,以便將它們回顯給用戶。

以下是我目前在做

// set up program options 
po::options_description optdesc("Allowed options"); 
optdesc.add_options() 
    ("help", "Produces this help screen") 
    ("opt1", po::value<string>(), "Option 1") 
    ("opt2", po::value<int>(), "Option 2") 
    ("opt3", po::value<bool>(), "Option 3); 

// parse command line 
try 
{ 
    po::store(po::parse_command_line(argc, argv, optdesc), cmdline); 
    po::notify(cmdline); 
} 

// do error handling ... 

// echo parameters back to user 
for (po::variables_map::iterator it = cmdline.begin(); it != cmdline.end(); ++it) 
{ 
    boost::any arg = it->second.value(); 
    if (typeid(string) == arg.type()) 
    { 
     cout << " " << it->first << ": " << boost::any_cast<string>(it->second.value()) << endl; 
    } 
    else if (typeid(int) == arg.type()) 
    { 
     cout << " " << it->first << ": " << boost::any_cast<int>(it->second.value()) << endl; 
    } 
    // etc... 

我真的不喜歡這種解決方案。由於Boost能夠將用戶輸入從字符串轉換爲合適的值,因此它應該能夠將值轉換回字符串表示,而不需要明確測試數據類型。

這可能嗎?如果是的話,我該怎麼做。

感謝

回答

2

你已經有argvargc,只是附和他們回到用戶

#include <iostream> 
#include <iterator> 

int 
main(int argc, char* argv[]) 
{ 
    std::cout << "got " << argc << " args" << std::endl; 
    std::copy(argv + 1, argv + argc, std::ostream_iterator<char*>(std::cout, " ")); 
    std::cout << std::endl; 
} 

產生

samm:stackoverflow samm$ ./a.out asdf 1 2 3 hello world 
got 7 args 
asdf 1 2 3 hello world 
samm:stackoverflow samm$ 

沒有必要通過variables_map迭代和投每個條目。

+0

感謝您的建議。當然,這是實現它的簡單方法。然而,這只是我試圖歸檔的一個最簡單的例子。有些情況下,這不是一個理想的解決方案:一個這樣的例子是,如果其中一個解析值作爲一個向量給出。 當然,我可以簡單地迴應數據,但它感覺不對。如果Boost做了所有沉重的舉動,他肯定有可能利用這一點。 – Compuholic

2

我面臨類似的問題,this是我的解決方案。 簡而言之,你必須編寫你自己的容器來選擇基於boost :: variant的選項,而不是在boots :: any(boost :: po所基於的)上。這個容器可以通過boost :: po選項通知來填充。這將允許您爲訪問選項使用訪問者模式,並以通用方式處理它們。