当前位置:  开发笔记 > 编程语言 > 正文

漂亮的sfinae与static_assert

如何解决《漂亮的sfinae与static_assert》经验,为你挑选了0个好方法。

我正在尝试创建一个将注册接收器的事件管理器.为此,我希望能够std::function使用给定的参数构造一个.但是,我希望最终用户可以轻松理解错误.我想用SFINAE和类型依赖这样做static_assert但我遇到了麻烦,因为这两个函数在有效输入上变得模糊不清.此外,我希望有多个错误原因,用户可以收到.由于存在两个故障点(提供无效的仿函数并提供错误的事件类型),我希望总共有3个函数,第一个是正确输入的函数,然后是不正确的输入滴漏(而不是有4个函数用于每个国家的组合).

这可以用c ++ 17解决,if constexpr但我的目标平台是c ++ 14,因此需要使用其他方法.

我当前的尝试(仅检查一个错误状态):

template 
auto 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调用函数之前不会触发.


一个更复杂的用例就是

template 
auto register(Func &&func)
-> decltype(func_t(std::forward(func))
            ,meta::is_in_tuple
            ,void()) {}

因此,如果第一次测试失败(func_t构造),那么我们就static_assert会这样做,如果第二次测试失败,我们就static_assert会这样做.因此,如果第一次测试失败,无论第二次测试如何,我们都会失败一些静态断言.然后,如果第一次测试通过,我们将打印关于第二次测试失败的信息.不必重写测试将是一个非常好的奖金.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有