您可以使用any_cast将std :: any *类型转换为原始类型的指针。但是,您如何做相反的事情?
string h = “str”;
string *j = &h;
std::any *hh = reinterpret_cast<any*>(j);
cout << (*hh).type().name();
它不起作用。无论我使用哪种类型,如果我取消对结果指针的引用并使用“。”访问成员,或者使用“->”访问该指针,则我的应用程序将失败。
我也尝试过static_cast和dynamic_cast,但是它们甚至无法编译。
答案 0 :(得分:3)
您不想使用std::any*
。您想要的只是一个std::any
。要将某物放入std::any
中,请使用
std::any anything_i_want;
//...
std::string some_string = "some text";
anything_i_want = some_string;
// now the any contains a `std::string`
std::string another_string = std::any_cast<std::string>(anything_i_want);
// now we get the string out of the any
答案 1 :(得分:2)
您似乎在问以下问题:如果您有指向某个已知包含在某个std::any
对象中的对象的指针,那么如何获得指向该std::any
对象的指针? / p>
通常,这无法完成。在某些情况下,由于小的对象优化,该对象可能直接存储在std::any
对象中。如果确定是这种情况,则可以基于(非常合理的)假设(给定类型的对象始终存储在std::any
对象内的相同位置的假设),自行调整指针。小对象优化适用。例如:
std::any a = 42;
auto p = std::any_cast<int>(&a);
const auto offset = reinterpret_cast<uintptr_t>(p) - reinterpret_cast<uintptr_t>(&a);
if (offset >= sizeof(std::any)) {
throw std::runtime_error("small object optimization doesn't apply");
}
// ...
// x points to an `int` inside a `std::any` object
auto q = reinterpret_cast<std::any*>(reinterpret_cast<uintptr_t>(x) - offset);
(不幸的是,无法在编译时检查小对象优化是否适用于您关心的特定类型。)
如果小对象优化不适用,则实际上没有办法返回到any
对象。这有点像问,如果您在单链列表中有指向某个节点的指针,那么如何获得指向上一个节点的指针。
答案 2 :(得分:0)
std::string h = “str”;
std::string *j = &h;
std::any *hh = std::any_cast<std::any*>(j);
仅指出它可以实际完成。您可以有一个函数来接收指向std :: any的指针。例如