C++ 如何解决;boost::bad“u any”cast:使用boost::any“u cast”转换失败;使用boost程序选项时?

C++ 如何解决;boost::bad“u any”cast:使用boost::any“u cast”转换失败;使用boost程序选项时?,c++,boost,types,casting,boost-program-options,C++,Boost,Types,Casting,Boost Program Options,是命令行 我尝试声明类型,如下所示: testboostpo -i 192.168.1.10 -p 5000 config.add_options() (“IP地址,i”,po::value(),“IP地址”) (“端口,p”,po::value(),“端口”); 但是错误仍然发生 这可能是真正的错误吗?添加选项时,需要将ip地址和端口声明为字符串: config.add_options() ("IPAddress,i", po::value<std::string&g

是命令行

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

testboostpo -i 192.168.1.10 -p 5000
config.add_options()
(“IP地址,i”,po::value(),“IP地址”)
(“端口,p”,po::value(),“端口”);
但是错误仍然发生


这可能是真正的错误吗?

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

config.add_options()
        ("IPAddress,i", po::value<std::string>(), "IP Address")
            ("Port,p", po::value<std::string>(), "Port");
config.add_options()
(“IP地址,i”,po::value(),“IP地址”)
(“端口,p”,po::value(),“端口”)
;

您会看到从
po::variables\u map
引发的
boost::bad\u any\u cast
异常,因为的两个
const char*
参数重载没有指定
po::value\u语义类型,因此将其转换为
std::string
将无法工作。如果要将该值转换为
std::string
,并且应用程序需要该值,请使用
required()

config.add_options()
    ("IPAddress,i", po::value<std::string>(), "IP Address")
    ("Port,p", po::value<std::string>(), "Port")
    ;

这是一个显示相同行为的示例,由编译链接运行(coliru)提供。

如果未正确处理可选参数,也可能出现此消息

Sam的解决方案确定了必需的参数,OP的代码建议必需-只需将它们标记为必需即可。对于可选输入,为我们提供了一个模板,用于在转换之前检查选项是否存在:

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$ 
if(vm.count(“地址”))
{
const std::string address=vm[“IPAddress”].as();

std::cout不一定和这家伙有同样的问题,但有件事让我抓狂:

如果将类型置于匿名命名空间中,将有两个名称相同但实例不同的类,转换将失败。例如:

a、 水电站:

if(vm.count("address")) 
{
    const std::string address = vm["IPAddress"].as<std::string>();
    std::cout << "address: " << address << std::endl;
}
if(vm.count("port")) 
    const std::string port = vm["Port"].as<std::string>();
    std::cout << "port: " << port << std::endl;
}
b、 cpp:

namespace {
class MyClass {...};
}
#包括“a.hpp”
cli_options.add_options()(“test”,po::value(),“test desc”);
c、 cpp:

#include "a.hpp"
cli_options.add_options()("test", po::value<MyClass>(), "test desc");
#包括“a.hpp”//这将产生不同的“MyClass”
vm[“test”].as();//在运行时失败。
它失败是因为
b.cpp
中的
MyClass
c.cpp
中的不属于同一个类。因为匿名命名空间


删除匿名名称空间解决了问题。

我收到了类似的错误消息,但这是因为我使用的是速记
I
,而不是
IPAddress

#include "a.hpp" // THIS WILL MAKE A DIFFERENT "MyClass"
vm["test"].as<MyClass>();  // Fails at runtime.
//这会引发强制转换异常
const std::string address=vm[“i”].as();
//这是不可能的
const std::string address=vm[“IPAddress”].as();

Boost使用声明的第一个。因此,如果您的选项声明为
IPAddress,i
您需要使用
vm[“IPAddress”]
,而
i,IPAddress
您需要使用
vm[“i”]

请将传递给程序的命令行参数张贴出来。nit:转换std::string::c_str()的结果是多余的
转换为
std::string
部分正确,转换为
std::string
po::variables\u映射中不存在的选项时出现
boost::bad\u any\u cast
异常。
if(vm.count("address")) 
{
    const std::string address = vm["IPAddress"].as<std::string>();
    std::cout << "address: " << address << std::endl;
}
if(vm.count("port")) 
    const std::string port = vm["Port"].as<std::string>();
    std::cout << "port: " << port << std::endl;
}
namespace {
class MyClass {...};
}
#include "a.hpp"
cli_options.add_options()("test", po::value<MyClass>(), "test desc");
#include "a.hpp" // THIS WILL MAKE A DIFFERENT "MyClass"
vm["test"].as<MyClass>();  // Fails at runtime.
// this throws the cast exception
const std::string address = vm["i"].as<std::string>();
// this does not
const std::string address = vm["IPAddress"].as<std::string>();