2016-04-24 12 views
3

の成功を示すために、どのように私はこのようなC++の関数を書きたいですstd :: errc 'enum class'型を使用します。私が見る1つの方法は、intを返すことです:のstd :: ERRCは、RETVAL

template <typename E> 
constexpr typename std::underlying_type<E>::type to_underlying(E e) { 
    return static_cast<typename std::underlying_type<E>::type>(e); 
} 

int f() { is_succ() ? 0 : to_underlying(err); } 

しかし、それは私のために醜いです。 std C++ 0x14の関数からC指向の成功/エラーコードを返す標準的な方法はどこですか?

PS。私は、the documentationから2015パッチ2.

+1

なぜ 'int'と' EXIT_SUCCESS'または 'EXIT_FAILURE'を使うのはなぜですか? – CoffeeandCode

+0

@CoffeeandCode:1972と呼ばれる.. –

+0

私の主な目標は、c-apiラッパーC++ライブラリを作成することです。私は関数extern "C"のセットを宣言しました。今私はエラー状態(または成功)を特定するために、それらからintを返さなければなりません。だから私は例外や内部エラーコードをC++コード内のCユーザーにとって価値のあるものに変換する必要があります。私はstd :: errcが良い選択だと思った。それは良い考えではなかったように見えます。今度は、native intとboost :: system :: errcの間で選択します。 PS。私の悪い英語については申し訳ありません:) – user2073942

答えて

0

をMS VCを使用している:

スコープ列挙std::errcはPOSIXエラーコードに対応するポータブルエラー状態の値を定義します。

std::errc定数は、特定のエラー条件が発生しているかどうかをチェックしているときと比較するためのものです(そのページの例を参照)。

成功はエラー状態ではありません。

代わりにstd::error_codeを返します。これらのエラー条件のいずれかをラップするか、デフォルトではエラー状態(つまり成功)はありません。

+0

std :: errc f(){std :: errc :: successを返します。 } 成功ステータスを返すには、関数本体に何を書きますか?それは問題でした。 – user2073942

+0

@ user2073942:私の答えの一言をお読みですか? –

+0

うん、私はしなければならなかった。私は答えではなく説明を読まなければならなかった。個人的なものは何もなく、私はC++が成功価値を返すべきではないという事実を受け入れました:)私にとっては、予測できないように見えます。少なくとも。 – user2073942

0

通常、関数から直接std::errc値を返しません。代わりにstd::error_codeを返します。たとえば、関数は次のように宣言されます。

std::error_code f(); 

次に、関数の結果をstd :: errcの値と比較します。たとえば:

std::error_code error = f(); 
if (error == std::errc::no_such_file_or_directory) 
{ 
    // deal with the error 
} 

std::error_codeは文脈転換ブール値です。関数が成功したかどうかをテストする方法は、ブール式でエラーコードを使用する方法です。たとえば:

std::error_code error = f(); 
if (error) 
{ 
    // the function failed... 
} 

は、このような機能から、成功を返すために、デフォルトはstd::error_codeを初期化し返します。たとえば:あなたはにCスタイルのAPIを消費しているとき

std::error_code f() 
{ 
    // do stuff... 
    return std::error_code{}; // success! 
} 

このアプローチはうまく動作します。ラッパーは、APIによって返された整数値を使用してstd::error_codeオブジェクトを構築し、これらのエラーをstd::errc値に変換する方法を定義するカスタムstd::error_categoryを作成します。

しかし、逆は機能しません。 C++ライブラリ用のCラッパーを作成する場合は、C言語の方法を実行する必要があります。 enumをエラー値で定義し、それらの値をCのエントリポイントから返します。

関連する問題