gpt4 book ai didi

c++ - 如何将 boost::any_cast 转换为 std::string

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:29 24 4
gpt4 key购买 nike

我有这个测试片段

#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;

}

在此 boost::any_cast 中,为 std::string 提供了 bad_casting 异常。这意味着出于某种原因,它无法将 boost::any 类型转换为 std::string。而其他类如 bitset 或我自己的用户定义类正在工作。您能告诉我原因和解决方法吗?

最佳答案

"Mayukh" 不是 std::string,它是一个包含 7 个字符的 const 数组 {'M' , 'a', 'y', 'u', 'k', 'h', '\0'。在 C++14 中,"Mayukh"susing namespace std::literals::string_literals; 之后的 std::string

在 C++11 中,std::string("Mayukh") 也是一个 std::string

boost::any 只支持转换回完全相同的类型(好吧,直到某些衰减/常量/等等)。它不支持类型之间的转换。参见 boost any documentation :

Discriminated types that contain values of different types but do not attempt conversion between them, i.e. 5 is held strictly as an int and is not implicitly convertible either to "5" or to 5.0. Their indifference to interpretation but awareness of type effectively makes them safe, generic containers of single values, with no scope for surprises from ambiguous conversions.

可以使用额外的智能转换来 boost any。例如,一个接受传入类型并可能自动转换它的伪任意(因此它不会存储 short:它将所有有符号整数类型转换为 int64_t 并未签名为 uint64_t,它在存储之前将 "hello" 转换为 std::string("hello") 等)。

关于c++ - 如何将 boost::any_cast 转换为 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273715/

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