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...> );

   // ...
 }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...