gpt4 book ai didi

c++ - 使用boost程序选项时如何解决 "boost::bad_any_cast: failed conversion using boost::any_cast"?

转载 作者:IT老高 更新时间:2023-10-28 22:26:48 35 4
gpt4 key购买 nike

//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 << "Values\n";

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 输出,似乎是类型转换问题:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl

' what(): boost::bad_any_cast: failed conversion using 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 和 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");

但错误仍然发生。

这可能是一个真正的错误吗?

最佳答案

您会看到 po::variables_map 抛出 boost::bad_any_cast 异常,因为 po::options_description_easy_init::operator() 的两个 const char* 参数重载确实未指定 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 block ,因为解析可以(并且正如您所注意到的)会抛出异常。这是一个示例 session :

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$

这是一个显示相同行为的 online demo,由 COMpile LInk RUn (coliru) 提供。

关于c++ - 使用boost程序选项时如何解决 "boost::bad_any_cast: failed conversion using boost::any_cast"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535180/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com