8

C ++では、クラスメンバーではない変換演算子を定義することは可能ですか?私は通常の演算子(+など)に対してそれを行う方法を知っていますが、変換演算子については知りません。

これが私のユースケースです。私はCライブラリを使用して、を渡しますPA_Unichar *。ライブラリは、PA_Unicharを16ビット整数として定義します。これは実際にはUTF-16でコード化された文字列です。std::stringUTF-8でコード化されたものに変換したいと思います。私はすべての変換コードを準備して機能させていますが、次のように書くことができる構文糖衣が欠けているだけです。

PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;

(通常、一時変数なしで1行になります)。

また注目に値する:

  • 私はそれstd::stringがからの暗黙の変換を定義していないことを知っています、char*そして私はその理由を知っています。同じ理由がここでも当てはまるかもしれませんが、それは重要ではありません。

  • からの正しい変換演算子を定義するのサブクラスustringがあります。それは機能しますが、これは代わりに変数を使用することを意味し、他のライブラリでそれらの文字列を使用する場合に変換する必要があります。ですから、それはあまり役に立ちません。std::stringPA_Unichar*ustringstd::stringstd::string

  • 代入演算子はクラスメンバーでなければならないため、代入演算子の使用は機能しません。

それで、あなたが制御していない2つの型(私の場合はPA_Unichar*std::string)の間に暗黙の変換演算子を定義することは可能ですか?それはクラス型であるかもしれませんし、そうでないかもしれませんか?

そうでない場合、回避策は何でしょうか?

4

4 に答える 4

9

無料の機能の何が問題になっていますか?

std::string convert(PA_Unichar *libOutput);

std::string myString = convert(theLibraryFunction());

コメントへの回答を編集します。

DrPizzaが言うように: 他の誰もが暗黙の変換によって開いた穴を、あなたが「視覚的な乱雑さ」と呼ぶ明示的な変換に置き換えることで埋めようとしています。

一時的な文字列については、次のコンパイラ バージョンを待ちます。右辺値参照が付属する可能性が高く、そのstd::string実装はその上に移動セマンティクスを実装し、コピーを排除します。単純に新しいコンパイラ バージョンにアップグレードする以外に、コードを高速化するための安価な方法はまだ見たことがありません。

于 2009-10-24T13:59:37.980 に答える
5

とにかく、暗黙の変換は悪魔です。変換関数呼び出しで明示的にします。

于 2009-10-24T19:22:57.733 に答える
4

「グローバル」変換演算子を定義できるとは思いません。基準はそれconversion functionsspecial member functions. 次の構文シュガーを考慮することができれば、次のように提案します。

struct mystring : public string
{
    mystring(PA_Unichar * utf16_string)
    {
        // All string functionality is present in your mystring.
        // All what you have to do is to write the conversion process.
        string::operator=("Hello World!");
        string::push_back('!');
        // any string operation...
    }
};

このクラスのポリモーフィックな動作は壊れていることに注意してください。ただし、型のポインターを介してそのオブジェクトを作成しない限りstring*、安全側にいます! したがって、このコードは完璧です:

mystring str(....);

前述のとおり、次のコードは壊れています。

string* str = new mystring(....);
....
delete str; // only deleting "string", but not "mystring" part of the object
// std::string doesn't define virtual destructor
于 2009-10-24T14:09:10.327 に答える
3

いいえ、できません。代替手段としてできることは、ターゲットクラスに変換コンストラクターを作成することです(派生しない限り、 std::string に変換したい場合はそうではありません)。しかし、私は他の答えに同意します。この場合、特にオブジェクトからではなくポインターから変換しているため、暗黙的な変換は推奨されないと思います。無料の関数を使用すると、コードが理解しやすくなり、次にコードを継承するプログラマーが確実に感謝します。

于 2009-10-24T21:11:34.707 に答える