cast void *并将其放入ostringstream中

时间:2012-04-27 08:03:12

标签: c++ casting void-pointers

我遇到问题void *我想把包含在字符串中的内容输出它,我知道在编译时刻编译器不知道指针指向什么,所以我想用一种cast(将*(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->second.value是一个void*,我希望得到它可以指向任何类型的值(int,string,float,long,char ..),我的问题是:是否安全?将返回指针的任何类型的正确值?我用int进行了测试它有效,但我不确定其余的。

请任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果您知道void*碰巧指向std::string,那么是的,这是安全的。

答案 1 :(得分:1)

您无法安全地将指向任意值的指针强制转换为字符串,并期望发生一些明智的事情;在绝对最小值时,您还需要知道指向的东西的大小,您可能还需要注意嵌入的NUL等。如果您知道它始终是std::string,那么您可以安全地转换为std::string;但你必须肯定地知道,或者你正在寻求核心转储或随机输出。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

绝对不安全。你怎么能确定你所指的是一个字符串?你是如何首先保留这种记忆的?

听起来像是一个设计问题 - 为什么你的数据blob 围绕着你不知道的类型?您是否尝试实施variant类型?