9

string月の名前を数字に変換するユーザー定義リテラルを作成しています。このリテラルの予想される使用法は次のようなものです

"Nov"_m

を返す必要があり11ます。

現時点で私のコードは次のようになります

constexpr Duration operator ""_m(const char* str, size_t len)
{
    return convert_month_to_int(str, len);
}

whereconstexpr int convert_month_to_int(const char, size_t)は実際の変換を行う関数です (-1月名が間違っている場合は戻ります)。

問題は、このリテラルに渡された文字列がどの月にも名前を付けていない場合、ある種のコンパイル エラーを表示したいということです。私static_assertは次の方法で使用してみました:

constexpr Duration operator ""_m(const char* str, size_t len)
{
    static_assert(convert_month_to_int(str, len) > 0, "Error");
    return convert_month_to_int(str, len);
}

convert_month_to_int(str, len)しかし、コンパイラはそれが定数式になるかどうかわからないため、これは機能しません。

この動作を達成する方法はありますか?

4

2 に答える 2

3

代わりに列挙型を使用するという提案に同意します。

とにかく、constexpr関数でこのようなエラーを通知する通常の方法は、例外をスローすることです。

constexpr Duration operator ""_m(const char* str, size_t len)
{
    return convert_month_to_int(str, len) > 0 ? convert_month_to_int(str, len) : throw "Error";
}

たとえば、この質問も参照してください。

于 2016-08-06T11:12:23.387 に答える