0

文字列に含まれるものを出力して出力したいという問題がvoid *あります。コンパイルの瞬間、コンパイラーはポインターが何を指しているのかわからないことがわかっているので、一種のキャスト(*(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

4 に答える 4

2

void*がたまたま a を指していることがわかっている場合はstd::string、はい、安全です。

于 2012-04-27T08:06:07.293 に答える
1

いいえ、絶対にそれを行うことはできず、void* が int を指し、それを std::string にキャストする場合、賢明な結果が期待できます。型情報をどこかに保存する必要があります。データを格納するポリモーフィックなクラス階層を作成するか、boost::variant を使用するか、独自の「判別共用体」を作成するか、その他の手法を使用します。

于 2012-04-27T08:07:44.293 に答える
1

任意の値へのポインターを文字列に安全にキャストして、適切な処理が行われることを期待することはできません。最低限、指している物のサイズも知る必要があり、埋め込まれたNULs などにも注意する必要があるかもしれません。常に a であることがわかっている場合は、安全std::stringに a にキャストできます。std::stringただし、確実に知る必要があります。そうしないと、コアダンプまたはランダム出力を求めています。

于 2012-04-27T08:05:27.187 に答える
0

絶対に安全ではありません。指しているものが文字列であることをどのように確認できますか? そもそもこのメモリをどのように予約したのですか?

設計上の問題のように聞こえますが、型がわからないデータ BLOBがあちこちにあるのはなぜですか? 型を実装しようとしていますvariantか?

于 2012-04-27T08:12:15.717 に答える