2

私の目標

errorcodesの大きな List を返す関数が複数あります。一部の機能は、「エラーコードのリスト」の同じおよび異なるエラーコードを使用します

  • 例えば:
    • fun1()errorcode1ORのみを返しますerrorcode2 (errorcode2 はこの関数でのみ使用されます)
    • fun2()errorcode1ORのみを返しますerrorcode3 (ただし、errorcode1 は両方の関数で使用されます)。

望ましいソリューションでは、次の点を考慮する必要があります。

  • どの関数がどのエラーコードを返すことができるかを定義する

  • 関数がこの関数に対して意図されていないエラーコードを返そうとした場合、コンパイルエラーを取得します

  • 関数の return または throw はすべて int に変換可能でなければなりません (これらの関数は C API の一部になるため)

私のアプローチ

これまでのところ、列挙型を使用するオプションを検討しましたが、解決策は私には魅力的ではありません

  1. 関数ごとに個別の列挙型を定義する
  2. すべての関数に対して 1 つのグローバル列挙型を定義する

関数ごとに個別の列挙型を定義する

enum errorcodefun1 {errorcode1=1, errorcode2=2};               // OK at least it is expressed what is expected for fun1
errorcodefun1 fun1() {  };  
enum errorcodefun2 {errorcode1_fun2=1, errorcode3_fun2=3  };   // minor problem: not expressing that errorcode1_fun2 is logical same as errorcode1

関数 (部分的に同じエラーコードを使用する) が多いほど、コードの重複が多くなります。

すべての関数に対して 1 つの列挙型を定義する

enum errorcodes {errorcode1=1, errorcode2=2, errorcode3=3};
errorcode fun1() {... } //do not like because I will get no compilation error if it returns errorcode3. Only errorcode1 and errocode2 is intended
errorcode fun2() {... } 

私の質問

列挙型をエミュレートするクラスを作成することを考えていましたが、これまでのところ、すべてのニーズを満たすソリューションが見つかりました。

私の目標を達成するための提案やアイデアはありますか?

4

2 に答える 2

3

アプローチ #1 を使用して安全を確保し、列挙型メンバーの同等性を表現するのはどうですか?

enum generic_error {
    ERR_OK,
    ERR_NOMEM,
    ERR_IO,
    ERR_GENERIC
};

enum first_error {
    FIRSTERR_OK = ERR_OK,
    FIRSTERR_NOMEM = ERR_NOMEM
};

enum second_error {
    SECONDERR_OK = ERR_OK,
    SECONDERR_IO = ERR_IO
};

int main()
{
    enum first_error f = FIRSTERR_OK;
    enum second_error s = SECONDERR_OK;
    assert(f == s); // never fires
    return 0;
}

ただし、これが特に良い方法であるというわけではありません... もし私があなただったら、1 つの一般的なエラー コードの列挙を選択するだけです。

于 2013-11-01T12:59:03.840 に答える
-1

ビットマスクを使用します。

enum Code : unsigned int
{
    None = 0,
    SomeError= 1,
    AnotherError = 2,
    YetAnotherError = 4
};

unsigned int valid_error_codes_for_func1 = SomeError | YetAnotherError;
于 2013-11-01T13:03:45.960 に答える