我正在尝试创建一个将注册接收器的事件管理器.为此,我希望能够std::function
使用给定的参数构造一个.但是,我希望最终用户可以轻松理解错误.我想用SFINAE和类型依赖这样做static_assert
但我遇到了麻烦,因为这两个函数在有效输入上变得模糊不清.此外,我希望有多个错误原因,用户可以收到.由于存在两个故障点(提供无效的仿函数并提供错误的事件类型),我希望总共有3个函数,第一个是正确输入的函数,然后是不正确的输入滴漏(而不是有4个函数用于每个国家的组合).
这可以用c ++ 17解决,if constexpr
但我的目标平台是c ++ 14,因此需要使用其他方法.
我当前的尝试(仅检查一个错误状态):
templateauto register(Func &&func) -> decltype(func_t (std::forward (func)), void()) {} template void register(Func &&) { static_assert(meta::delay_v , "Function object cant be constructed by function"); }
meta::delay_v
等于false
但依赖于其参数,因此在static_assert
调用函数之前不会触发.
一个更复杂的用例就是
templateauto register(Func &&func) -> decltype(func_t (std::forward (func)) ,meta::is_in_tuple ,void()) {}
因此,如果第一次测试失败(func_t
构造),那么我们就static_assert
会这样做,如果第二次测试失败,我们就static_assert
会这样做.因此,如果第一次测试失败,无论第二次测试如何,我们都会失败一些静态断言.然后,如果第一次测试通过,我们将打印关于第二次测试失败的信息.不必重写测试将是一个非常好的奖金.