【问题标题】:Casting specific pointer to std::any pointer将特定指针转换为 std::any 指针
【发布时间】:2019-12-17 14:40:59
【问题描述】:

您可以使用 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_cast 不像你想象的那样工作。请参阅this 了解它的实际作用。
  • reinterpret_cast - 我不在乎你从什么投射或投射到什么,这可能是一个错误。
  • std::any a = h; std::any *hh = &amp;a; 是这样做的方法。不知道你为什么想要,你想达到什么目的?
  • @AlanBirtles std::any *hh = &amp;h; 是一个很大的数字。
  • @AlanBirtles 因为您不允许将指针转换为不相关的类型。 std::any*std::string* 不相关。这也不是你应该如何使用std::any

标签: c++ pointers casting any


【解决方案1】:
std::string h = “str”;
std::string *j = &h;
std::any *hh =  std::any_cast<std::any*>(j);

只是指出它实际上可以完成。例如,您可以让函数接收指向 std::any 的指针。

【讨论】:

    【解决方案2】:

    您似乎在问以下问题:如果您有一个指向已知包含在某个 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对象。这有点像问,如果你有一个指向单链表中节点的指针,如何获得指向前一个节点的指针。

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 你知道一个泛化类,它的指针版本可以转换为特定类型的指针,反之亦然?我想要一个可以指向任何类型的指针,然后我可以将它转换为它实际上是的那种类型的指针。
      • @PatrikNusszer std::anystd::any any_ptr = some_pointer; auto ptr = std::any_cast&lt;type_of_some_pointer&gt;(any_ptr)
      • @PatrikNusszer 我认为您谈论std::any 的方式隐藏了您实际尝试做的事情。您是否正在寻找可以指向任何可能类型的指针?您是否正在寻找类似于 Java 的 Object 之类的东西,它是所有类的父类型?
      • @PatrikNusszer 我推荐你edit 你的问题来解释是什么让你想这样做,以及你想要解决的更大的问题是什么
      • @nathanoliver 你拯救了我的一天
      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 2022-01-25
      • 2012-10-24
      • 2017-02-12
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多