0

を返す関数を持つC++ オブジェクト ( boost::format) があります。str()std::string

したがって、フォーマットされた C 文字列が必要な場合は、次のように記述する必要があります。

(boost::format("%1% %2%") % "1" % "2").str().c_str()

私はそれがかなり冗長だと思います、そして私はそれをたくさん必要としています。を持ち、次のように機能する派生クラスを作成することを考えましたoperator char*(Ch = char または wchar_t):

operator Ch const* () const
{
    return str().c_str();
}

しかしもちろん、 によって返される文字列はstr()、関数が戻るときに割り当てが解除され、有効な C 文字列は返されません。

回避策はありますか?

回避策として、周囲の関数呼び出しが続く限り存在する文字列を作成する必要があります。

lib_function((boost::format("%1% %2%") % "1" % "2").str().c_str()); 
// can be deallocated here
4

3 に答える 3

1

以下に示すような構造を定義できます。

struct my_str
{
  const std::string &tmp;
  my_str(const boost::format &tmp) : tmp( tmp.str() ) {}
  operator const char *() const { return tmp.c_str(); }
};

そして、あなたはそれを次のように呼び出すことができます

lib_function ( my_str(boost::format("%1% %2%") % "1" % "2") );

参照がぶら下がっているのではないかと心配している場合は、この記事を読んでください。

于 2014-04-29T13:40:34.410 に答える
1

スタック上の std::string を返します。これは余分なコピーなので、パフォーマンスが重要な場合は悪い考えですが、冗長な入力のほとんどを排除するのに役立ちます.

于 2014-04-29T12:55:44.943 に答える