如何将:: any_cast提升为std :: string

May*_*kar 6 c++ boost c++11

我有这个测试片段

#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::stringusing 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")等),然后再存储它.


Bar*_*rry 6

那是因为"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)