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

C++: Static assert that a parameter pack matches a function type

给定函数类型 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...> );

   // ...
 }