C ++:静态断言参数包与函数类型匹配

问题描述

考虑到函数类型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...> );

   // ...
 }