私はユニコードの例外を除いて、ヘッダーのみのクラスを実装したいと、私は次のコードで開始しました:Unicodeの例外クラス
#pragma once
#include <string>
#include <exception>
using namespace std;
class uexception : public exception
{
public:
explicit uexception(const wchar_t* msg)
{
this->msg = msg;
}
explicit uexception(const wstring& msg)
{
this->msg = msg;
}
const wchar_t* uwhat() const throw()
{
return msg.c_str();
}
private:
wstring msg;
const char* what() const throw() //hidden
{
return NULL;
}
};
これは正常に動作しますが、私はいくつかの質問を持っている:
- なぜstd :: exceptionクラスから派生する必要がありますか?これはまったく必要ないかもしれませんか?
- クラスの実装で何か不足していますか?
わずかな警告(とあなたの2番目の質問に関連します) :Windowsでは、 'wchar_t'はわずか16ビットです。あなたの内部エンコーディングがUTF-8の場合はプレーン 'char'を、内部的にUTF-32を使用する場合は' char32_t'を使用してください。例えば、 [この文字型リファレンス](http://en.cppreference.com/w/cpp/language/types%23Character_types#Character_types)を参照してください。 –
あなたの最初の質問について:いいえ、あなたは* 'std :: exception'(http://en.cppreference)から派生する必要はありません。com/w/cpp/error/exception)、そうでなければ 'std:exception'をキャッチするプログラムはあなたの例外を捕捉せず、あなたのライブラリのために特別なケースを追加する必要があります。ああ、ところで、標準の例外を "Unicode対応の"例外と交換する場合は、既存の例外階層全体を再実装することを忘れないでください。 –
最後に、この例外ライブラリには本当に必要なものがありますか?多くのコンパイラはUTF-8文字列リテラルを喜んで受け入れます。つまり、標準の標準例外で既にUnicodeを使用できることを意味します。 –