将特定指针转换为 std::any 指针
Casting specific pointer to std::any pointer
您可以使用 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,但它们甚至无法编译。
您似乎在问以下问题:如果您有一个指向已知包含在某些 std::any
对象中的对象的指针,您如何获得指向该 std::any
对象的指针?
一般来说,这是做不到的。在某些情况下,由于小对象优化,对象可能直接存储在 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
对象。这有点像问,如果你有一个指向单向链表中节点的指针,如何获得指向前一个节点的指针。
您不想使用 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
std::string h = “str”;
std::string *j = &h;
std::any *hh = std::any_cast<std::any*>(j);
只是指出它实际上是可以做到的。例如,您可以让函数接收指向 std::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,但它们甚至无法编译。
您似乎在问以下问题:如果您有一个指向已知包含在某些 std::any
对象中的对象的指针,您如何获得指向该 std::any
对象的指针?
一般来说,这是做不到的。在某些情况下,由于小对象优化,对象可能直接存储在 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
对象。这有点像问,如果你有一个指向单向链表中节点的指针,如何获得指向前一个节点的指针。
您不想使用 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
std::string h = “str”;
std::string *j = &h;
std::any *hh = std::any_cast<std::any*>(j);
只是指出它实际上是可以做到的。例如,您可以让函数接收指向 std::any 的指针。