C++ のラムダ式を型推論しながら関数ポインタ型で受け取る

ほぼ使うことはないだろうけど、かなりの知見だったので覚書。

ラムダ式を関数ポインタ型へ変換する

これは割と一般的な知識だと思うんですが、『キャプチャしていない』ラムダ式は関数ポインタ型へとキャストする事が出来ます。

using func_t = int(*)(int);
// 関数ポインタ型として受け取る事が出来る
func_t twice = [](int n){ return n + n; };

+ 単項演算子で明示的に関数ポインタ型に変換する

さて、これを踏まえて次のように『関数ポインタ型を型推論する』ような関数にラムダ式を渡したいとします。

// テンプレートで戻り値型や引数型を推論するよ
template<typename R, typename A>
void
func(R(*f)(A)){
    
}

// error: no matching function for call to 'func'
func(
    [](int n){ return n + n; }
);

しかし、この場合は型変換されずにエラーになってしまいます。
こういう場合に + 単項演算子を使うことで明示的に関数ポインタ型に変換することが出来ます。

// テンプレートで戻り値型や引数型を推論するよ
template<typename R, typename A>
void
func(R(*f)(A)){
    
}

// ok
func(
    +[](int n){ return n + n; }
);

関数ポインタ型にキャスト出来ることは知っていたけど + 単項演算子で明示的に関数ポインタ型に変換できることは知らなかった…。
まあ実際に使う機会があるかどうかは別ですが…。

参照