std::is_callable
は、ところでC++ 17の機能です。
あなたの関数myFun
は何も返さないので、戻り値としてenable_if
を入れるのはちょっと変です。うん、テンプレートが選択されている場合には、void
になるでしょうが、それは、デフォルトのテンプレート引数としてそれを置くためにおそらくより読みやすいです:
template<typename T, std::enable_if_t<std::is_callable_v<T()>, int> = 0>
void myFun(T&& val)
{
foo(std::forward<T>(val));
}
Demo
それはあなたのenable_if
のために少し奇妙になりますが、真空中に存在する。少なくとも、私たちはstatic_assert
経由で収まると良いコンパイラエラーをユーザに提供していないすべてのタイプキャッチする必要があります
template<typename T, std::enable_if_t<std::is_callable_v<T()>, int> =0>
void myFun(T&& val)
{
foo(std::forward<T>(val));
}
template<typename T, std::enable_if_t<!std::is_callable_v<T()>, int> =0>
void myFun(T&& val)
{
static_assert(sizeof(T) == 0, "myFun is only callable with an argument that can be called as a function with no params");
}
Demo2
'Allowed_Type'用のテンプレートを特化ない理由をと一般的なテンプレートを無効にしますか? – wally
それはよりよい解決策でしょうか? –
(ほぼ)特定のタイプを処理する場合は常にオーバーロードが優先されます。 – AndyG