std::is_invocable
次のような任意の関数引数タイプで使用する方法はありますかstd::is_invocable<Function, auto>
? アイデアはFunction
、引数のタイプに関係なく、1 つの引数を受け入れることができるかどうかを確認することです。auto lambda1 = [](auto x) {...}
ユースケースとして、 、auto lambda2 = [](auto x, auto y) {...}
、および高次のテンプレート化された関数の2 つのラムダを検討してください。
// specialize for 1 argument
template<typename Function, std::enable_if_t<(std::is_invocable<Function, auto>::value && !std::is_invocable<Function, auto, auto>::value)>, bool> = true>
void higherOrderFunc(Function&& func);
// specialize for 2 arguments
template<typename Function, std::enable_if_t<std::is_invocable<Function, auto, auto>::value, bool> = true>
void higherOrderFunc(Function&& func);
最初のケースの!std::is_invocable<Function, auto, auto>::value
は、オーバーロードされた関数のあいまいさを防ぐためです (つまり、この場合の優先される特殊化は、あいまいさの場合の 2 つの引数の 1 つです)。
auto
この場合、このように使用できないことを認識していることに注意してください。この動作を(少なくとも部分的に)実装する方法があるかどうかを尋ねています。