将特定的指针转换为std :: any指针

时间:2019-08-09 21:07:22

标签: c++ pointers casting any

您可以使用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,但是它们甚至无法编译。

3 个答案:

答案 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的指针。例如

相关问题