4

const std::string &を返すクラスメソッドをconst boost::interprocess::basic_string &に置き換えようとしています。私が直面している主な課題は、実装が類似しているにもかかわらず、2 つのクラス間の非互換性です。より明確な説明のために、それをコードに入れます

class A
{ std::string m_str;
 const std::string & StrVal() { return m_str; }
}

このクラスは次のようになります。

typedef boost::interprocess::allocator<char,boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocatorChar;
typedef boost::interprocess::basic_string<char, std::char_traits<char>,ShmemAllocatorChar> ShMemString;

class A
{
 ShMemString m_str;
 const ShMemString & StrVal() { return m_str; }
}

問題は、これに依存する巨大なコード ベースがあることです。

A a;
const std::string & str = a.StrVal();
// Many string specific operations go here, comparing str with other std::strings for instance

予想される結果を const ShMemString & に置き換えてすべてのコードを調べたとしても、その後の使用法も修正するのはさらに困難な作業になります。ブーストの文字列に std::string からの比較/構築メソッドが含まれていないことに驚きました。

これにアプローチする方法についてのアイデアはありますか?

4

2 に答える 2

2

問題は、これに応じて巨大なコードベースがあることです。

なぜA::StrVal2番目のもので?を返すのinterprocess::basic_stringですか?これは、内部Aで使用するクラスの実装の詳細です。インターフェイスinterprocess::basic_stringが使用する実際の文字列クラスは、同じである必要はありません。これは単にリファクタリングが不十分です。

A::StrValstd::stringいつものように、を返す必要があります(もちろんではありませconst&んが、そのためにユーザーコードを変更する必要はありません)。したがって、A::StrVal2つの文字列タイプ間で変換を行う必要があります。これが適切なリファクタリングが行われる方法です。実装を変更しますが、インターフェースは同じままです。

はい、これは文字列データをコピーする必要があることを意味します。それと一緒に暮らす。

于 2011-09-16T20:58:21.107 に答える
2

boost::interprocess::basic_string<>への変換があったとしてもstd::basic_string<>、目的にはまったく役に立ちません。変換後、インタープロセス文字列は破棄され、そのアロケータが重要です (つまり、共有メモリにデータを保持するアロケータです。basic_string<>そもそも実装を切り替える動機だと思います)。

したがって、最終的には、すべてのコードを調べて、期待される結果を置き換えるしかありませんShMemString const&(またはauto const&、コンパイラがそれをサポートするのに十分なほど新しい場合)。


将来的にこれをより簡単にするために、typedef慎重に:

struct A
{
    typedef ShMemString StrValType;
    StrValType const& StrVal() { return m_str; }
private:
    StrValType m_str;
};

// ...

A a;
A::StrValType const& str = a.StrVal();

このように、typedef内部のみAを変更する必要があり、それに依存するすべてのコードは自動的に正しい型を使用します。

于 2011-09-16T16:56:18.430 に答える