【问题标题】:casting void* and put it in ostringstream铸造 void* 并将其放入 ostringstream
【发布时间】:2012-04-27 08:03:12
【问题描述】:

我对@9​​87654321@ 有疑问我想将包含的内容放在一个字符串中以输出它,我知道在编译时编译器不知道指针指向什么所以我想使用一种强制转换(将*(void*) 转换为字符串)static_cast:

  std::string get_Info_Field (std::string nameTab,int IDF)   

  {     ostringstream os;
        iter=Inst_Data.find(nameTab);

        if(iter!= Inst_Data.end())
        {   iterF=(iter->second).find(IDF);
            if(iterF!=(iter->second).end())
                    {os<<*static_cast<std::string*>(iterF->second.value);}
            else    { os<<""; }
        }
        else {  os<<"";}

    return os.str();
};

这里iterF-&gt;second.value 是一个void*,我想得到它可以指向任何类型(int、string、float、long、char..)的值,我的问题是:这安全吗?无论类型如何,都会返回正确的指针值?我用int 测试过它可以工作,但我不确定其余的。

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 可能有比使用 void* 更好的方法,是否可以将其转换为实际处理正确类型而不是使用不安全强制转换的模板函数?
  • 感谢 Benj,模板肯定更安全,但在我的项目中,我有一个名为 Field 的泛型类和每种类型值的派生类(intField,stringField.. .),最好还是使用一个模板和一个类来处理所有事情。

标签: c++ casting void-pointers


【解决方案1】:

如果您知道void* 恰好指向std::string,那么是的,它是安全的。

【讨论】:

  • "我想得到它可以指向任何类型的值(int,string,float,long,char..)"
  • 是的,但是“我想把包含的内容放在一个字符串中输出”我认为它是一个字符串。坦率地说,很难确定。
  • 我认为这意味着数据是任意的,他想将其转换为字符串......虽然我同意,但有点不清楚。
  • 是的,类型是任意的,我想将其转换为字符串以便之后对其进行操作。
【解决方案2】:

您不能安全地将指向任意值的指针转换为字符串并期望发生一些合理的事情;至少你还需要知道所指向的东西的大小,你可能还需要注意嵌入的NULs 等。如果您知道它始终是std::string,那么您可以安全地转换为std::string;但是您必须确定地知道,否则您正在寻求核心转储或随机输出。

【讨论】:

  • 感谢您的宝贵时间,实际上值的类型可以是 int,float,string ... 并不总是字符串,因此我想获取此值并将其放入字符串中我可以输出并使用它(我需要将它与其他字段值进行比较)
  • 我说的还是真的;至少你需要一个大小(所以你可以把它当作一个任意的base+length字节数组),最好你应该使用一些类型化的表示(一个知道如何复制自己的对象,或者容器应该是一个模板类型)。
  • 我不能使用模板,因为我有一个对象Table,其映射为Fields,这里可以是我不知道的任何类型的字段来指示女巫类型声明模板时的模板。
  • 那么您将需要使用其他一些方法来识别您的数据,以便正确保存和恢复数据:存储地址 + 大小、使用冻结/解冻方法指向对象、区分联合等.
【解决方案3】:

不,如果 void* 指向说 int 并且您将其转换为 std::string,那么您绝对不能这样做并期望得到合理的结果。您需要在某处存储类型信息,方法是使用多态类层次结构来包含您的数据、使用 boost::variant、编写自己的“可区分联合”或其他一些技术。

【讨论】:

  • 好的,谢谢@John,我没有使用 boost::variant,然后我会进行一些研究并尝试它,看看是否符合我的目的。
【解决方案4】:

绝对不安全。你怎么能确定你指向的是一个字符串?你最初是如何保留这段记忆的?

听起来像是一个设计问题 - 为什么会有 data blobs 在你不知道的类型周围浮动?您是否尝试实现 variant 类型?

【讨论】:

  • 不确定我的指针是否指向一个字符串,它可以是任何类型(int、float、double、long、string)
  • 听起来你所拥有的是一个变体类型。您可以自己关闭它,或者像其他人建议的那样查看boost::variant 可能更容易。我以前做过几次这样的事情——创建允许复杂、动态数据存储的数据结构,但我想这些天,我只会使用boost::variant。如果你想自己做,那么我建议更改 void* 并传递一个指向抽象基类的指针,从中派生出围绕你的整数、双精度浮点数等的包装类。
  • 感谢您抽出宝贵时间 组件 10,我通过一个包含我所有类型值的简单枚举来修复它
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多