我有这个测试片段
#include <boost/any.hpp>
#include <iostream>
#include <vector>
#include <bitset>
#include <string>
class wrapper {
int value;
char character;
std::string str;
public:
wrapper(int i, char c, std::string s) {
value = i;
character = c;
str = s;
}
void get_data(){
std::cout << "Value = " << value << std::endl;
std::cout << "Character = " << character << std::endl;
std::cout << "String= " << str << std::endl;
}
};
int main(){
std::vector<boost::any> container;
container.push_back(10);
container.push_back(1.4);
container.push_back("Mayukh");
container.push_back('A');
container.push_back(std::bitset<16>(255) );
wrapper wrap(20, 'M', "Alisha");
container.push_back(wrap);
std::cout << boost::any_cast<int>(container[0]) << std::endl;
std::cout << boost::any_cast<double>(container[1]) << std::endl;
std::cout << boost::any_cast<std::string>(container[2]);
std::cout << boost::any_cast<char>(container[3]) << std::endl;
std::cout << boost::any_cast<std::bitset<16>>(container[4]);
auto p = boost::any_cast<wrapper>(container[5]);
p.get_data();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此boost::any_cast给出了bad_casting异常std::string.这意味着由于某种原因它无法进行类型boost::any转换std::string.而其他类bitset或我自己的用户定义类正在工作.你能告诉我为什么和出路吗?
Yak*_*ont 12
"Mayukh"不是一个std::string,它是一个const7个字符的数组{'M', 'a', 'y', 'u', 'k', 'h', '\0'}.在C++ 14中,"Mayukh"s是一个std::string后using namespace std::literals::string_literals;.
在C++ 11中,std::string("Mayukh")也是一个std::string.
boost::any只支持转换回完全相同的类型(好吧,直到某些衰变/ const /等).它不支持类型之间的转换.请参阅提升任何文档:
包含不同类型的值但不尝试在它们之间进行转换的歧视类型,即
5严格保持为int并且不能隐式转换为"5"或转换为5.0.他们对解释的漠不关心,但对类型的认识有效地使他们成为单一价值观的安全,通用容器,没有范围可以避免模糊转换带来的惊喜.
扩充any额外的智能转换可以做到的.例如,一个伪任何采用传入类型,并且可能自动转换它(因此它不会存储shorts:它将所有已签名的整数类型转换为int64_t和未签名uint64_t,转换"hello"为std::string("hello")等),然后再存储它.
那是因为"Mayukh"不是std::string.这是一个const char[7],会腐烂成const char*:
boost::any a = "Mayukh";
std::cout << a.type().name() << '\n'; // prints PKc, pointer to const char
if (boost::any_cast<const char*>(&a)) {
std::cout << "yay\n"; // prints yay
}
Run Code Online (Sandbox Code Playgroud)
如果你想能够使用any_cast<std::string>,你需要把它放在std::string:
container.push_back(std::string("Mayukh"));
Run Code Online (Sandbox Code Playgroud)