c++ - C++ 如何解决 boost:: bad_any_cast: 使用boost程序选项时,使用 boost:: any_cast失败?

  显示原文与译文双语对照的内容
126 4

//Using boost program options to read command line and config file data


 #include <boost/program_options.hpp>


 using namespace std;


 using namespace boost;


 namespace po = boost::program_options;



int main (int argc, char *argv[])


{


 po::options_description config("Configuration");


 config.add_options()


 ("IPAddress,i","IP Address")


 ("Port,p","Port")


 ;



 po::variables_map vm;


 po::store(po::parse_command_line(argc, argv, config),vm);


 po::notify(vm);



 cout <<"Valuesn";



 string address = (vm["IPAddress"].as<std::string> ()).c_str();


 string port = (vm["Port"].as<std::string>()).c_str();



 cout <<(vm["IPAddress"].as <string> ()).c_str();


 cout <<"" <<(vm["Port"].as<string>()).c_str();



 return 0;



}



输入的值是否不可用?

这里是gdb输出,似乎是强制转换问题:

在抛出':: exception_detail:: clone_impl的实例后调用终止

'what(): boost::bad_any_cast: 使用 boost::any_cast 转换失败


 Program received signal SIGABRT, Aborted.


 0x0000003afd835935 in raise () from/lib64/libc.so.6




string address = (vm["IPAddress"].as<std::string> ()).c_str();



出现错误;我尝试了 std::string 和字符串,结果相同。


testboostpo -i 192.168.1.10 -p 5000



是 命令行 。

我尝试声明类型,如下所示:


config.add_options()


 ("IPAddress,i", po::value<std::string>(),"IP Address")


 ("Port,p", po::value<std::string>(),"Port");



但错误仍然发生。

这是真的Bug?

时间: 原作者:

64 1

你会看到从 po::variables_map 抛出的boost::bad_any_cast 异常,因为的两个 const char* 参数重载po::options_description_easy_init::operator() 不指定 po::value_semantic 类型,因此将它的转换为 std::string 将不工作。 如果要将值转换为 std::string,并且需要应用程序的值,请使用 required() 值语义。


#include <boost/program_options.hpp>


namespace po = boost::program_options;



int main (int argc, char *argv[])


{


 po::options_description config("Configuration");


 config.add_options()


 ("IPAddress,i", po::value<std::string>()->required(),"IP Address")


 ("Port,p", po::value<std::string>()->required(),"Port")


 ;



 try {


 po::variables_map vm;


 po::store(po::parse_command_line(argc, argv, config),vm);


 po::notify(vm);


 std::cout <<"Values" <<std::endl;



 const std::string address = vm["IPAddress"].as<std::string>();


 const std::string port = vm["Port"].as<std::string>();



 std::cout <<"address:" <<address <<std::endl;


 std::cout <<"port:" <<port <<std::endl;


 } catch ( const std::exception& e ) {


 std::cerr <<e.what() <<std::endl;


 return 1;


 }



 return 0;


}



注意由于解析可以引发异常,所以添加的catch块。 以下是一个示例会话:


samm$./a.out


the option '--IPAddress' is required but missing


samm$./a.out --IPAddress 127.0.0.1


the option '--Port' is required but missing


samm$./a.out --IPAddress 127.0.0.1 --Port 5000


Values


address: 127.0.0.1


port: 5000


samm$ 



下面是一个在线演示插件,展示了同样的行为,通过编译链接来提供帮助。

原作者:
69 4

添加选项时,需要将ip地址和端口声明为字符串:


config.add_options()


 ("IPAddress,i", po::value<std::string>(),"IP Address")


 ("Port,p", po::value<std::string>(),"Port")


 ;



...