1

给定函数类型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()通过从编译器输出中隐藏这两种类型来使情况变得更糟?

4

1 回答 1

3

你已经标记了 C++17,那么......那么使用std::is_invocable呢?

我想如下

template <typename F = void(), typename... Args>
auto call (Args && ... args)
 {
   static_assert( std::is_invocable_v<F, Args...> );

   // ...
 }
于 2020-10-31T13:04:30.123 回答