読者です 読者をやめる 読者になる 読者になる

constexpr 関数を書きやすくする RETURN マクロ

C++11 では関数の戻り値型を後置する構文が新たに入りました.

auto plus(int a, int b) -> int
{
    return a+b;
}

C++ の型はテンプレートが絡むと長くなりがちなので,今までは戻り値型だけで改行したりテンプレートのデフォルト引数を使って戻り値型を定義していたのが後置することで比較的綺麗に書けるようになりました.
もう一つの利点として,戻り値型を決定するのに引数を利用することができるようになります.constexpr な関数では return 文のみしか書けないため,return 文に渡す式が関数の戻り値型を決定することを利用して

auto constexpr plus(int a, int b) -> decltype(a+b)
{
    return a+b;
}

というふうに,関数の戻り値型をコンパイラに決定させることができます.
しかし,同じ式を2回書かなければならず,手間がかかっていました.今まではエディタに return 文の式の部分を正規表現で適当に抜き取らせて,decltype の部分を自動補完させていましたが,最近はこんな感じのマクロを定義するのも有りかなぁと思うようになってきました.

#define RETURN(...) -> decltype(__VA_ARGS__) { return (__VA_ARGS__); }

constexpr auto plus(int a, int b)
    RETURN(a+b);

単純なマクロですが,結構すっきりして気に入っています.
やり過ぎ感はありますが,こんな感じにすればますますすっきり…

#define RETURN(...) -> decltype(__VA_ARGS__) { return (__VA_ARGS__); }
#define VAR constexpr auto

VAR plus(int a, int b)
    RETURN(a+b);