问题描述
考虑到函数类型void()
,void(int)
等...,我们可以static_assert()
认为Args&&... args
与函数类型兼容吗?
template <typename F = void(),typename... Args>
auto call(Args&&... args)
{
// TODO: check if F is compatible with Args
if constexpr (std::is_same_v<void,decltype(func(args...))>)
func(std::forward<Args>(args)...);
else
return func(std::forward<Args>(args)...);
}
使用decltype(func(args...))
会导致错误,但这不是最好的错误。另外,通过隐藏编译器输出中的两种类型,static_assert()
是否有可能使情况变得更糟?
解决方法
您已经标记了C ++ 17,所以...使用std::is_invocable
怎么办?
我想如下
template <typename F = void(),typename... Args>
auto call (Args && ... args)
{
static_assert( std::is_invocable_v<F,Args...> );
// ...
}