0

void *想将包含的内容放入字符串中以输出它有问题,我知道在编译时编译器不知道指针指向的内容,所以我认为使用一种强制转换(强制*(void*)转换为字符串)静态演员:

  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

4 回答 4

2

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

于 2012-04-27T08:06:07.293 回答
1

您不能安全地将指向任意值的指针转换为字符串并期望发生一些明智的事情;绝对最低限度,您还需要知道所指向事物的大小,并且您可能还需要注意嵌入NUL的 s 等。如果您知道它始终是 a,std::string那么您可以std::string安全地转换为 a;但是您必须确定地知道,否则您正在寻求核心转储或随机输出。

于 2012-04-27T08:05:27.187 回答
1

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

于 2012-04-27T08:07:44.293 回答
0

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

听起来像是一个设计问题——为什么会有你不知道类型的数据块漂浮在周围?您是否正在尝试实现一种variant类型?

于 2012-04-27T08:12:15.717 回答