0

私が書いているライブラリのUnicode文字列クラスを使用する次のコードがあります。

#include <cstdio>
#include "ucpp"
main() {
  ustring a = "test";
  ustring b = "ing";
  ustring c = "- -";
  ustring d;
  d = "cafe\xcc\x81";
  printf("%s\n", (a + b + c[1] + d).encode());
}

ustringクラスインスタンスのencodeメソッドは、内部UnicodeをUTF-8char*に変換します。ただし、charクラス定義にアクセスできないため、暗黙的な型キャストを定義する方法がわかりません(したがって、printfなどで使用するときに手動でencodeを呼び出す必要はありません)。

4

1 に答える 1

7

まず、暗黙的な変換を提供しないことを検討することをお勧めします。エラーとして予期しない変換がキャッチされない状況は、必要なencodeときに呼び出すコストを上回る場合がありますchar*

暗黙的な変換を提供することにした場合は、次のように宣言します (クラス定義内で)。

operator char*();

メソッド const を作成できる場合があります。その場合、次を使用できます。

operator char*() const;

通常、変更不可能なバッファへのポインタも返したいでしょう:

operator const char*() const;

関数の本体にはreturn、適切なポインターが必要です。暗黙的な変換の場合、クライアントは返されたバッファを解放する必要がないことを想定しているため、戻り値用に特別なバッファを作成する必要がある場合は、解放する適切なポイントまでこのバッファへのポインタを維持する必要があります。通常、このような適切なタイミングは、クラス オブジェクトに対する次の変更操作である可能性があります。

printfasは任意の数とタイプのオプション引数を取り、いずれの場合でもクラス オブジェクトをキャストする必要があることに注意してください。

printf("%s\n", static_cast<const char*>(a + b + c[1] + d));

また

printf("%s\n", (const char*)(a + b + c[1] + d));

これらは両方とも、 への明示的な呼び出しよりも冗長ですencode

于 2010-05-02T09:40:27.860 に答える