これがアイデアです。粗いバージョンでは、ライブラリを変更する必要があり、将来的には壊れる可能性がありますが、それから始めましょう:
すでに次の 2 つの関数があります。
std::string as_utf8(const wchar_t* str);
std::wstring as_wide(const char* str);
またはpugi::char_t
のいずれかであることもわかっています。したがって、変換関数を呼び出すために必要なのは、ヘッダーに追加できるオーバーロードだけです。char
wchar_t
pugi::char_t
std::string as_utf8(const char* str) { return str; }
std::wstring as_wide(const wchar_t* str) { return str; }
これで、次のように記述できます。
pugi::char_t * mystr = get_magic_string();
std::string mystrU8 = as_utf8(mystr);
これは、オーバーロードのおかげで両方のコンパイラ設定で機能し、pugi::char_t
が既にchar
である場合、これは完全に最適化されます (もちろん、エンコーディングが既に UTF-8 であり、他の 8 ビット エンコーディングではないと仮定します!)。
(また、 と同じ魔法をサポートする引数を取るオーバーロードを提供する必要がありますstd::string
。)std::wstring
pugi::string_t
ライブラリの汚染が心配な場合は、独自のラッパーを作成します。
std::string my_utf8(const char * str) { return str; }
std::string my_utf8(const wchar_t * str) { return as_utf8(str); }