繁体   English   中英

在编译时触发void constexpr?

[英]Triggering void constexpr at compile time?

我有一个constexpr函数,该函数将许多static_asserts分组为设计合同。 我想在编译时调用它,而不必创建未使用的constexpr变量。

这是我当前必须执行的操作的一个示例(c ++ 17)。

template<size_t N = 0, typename... Ts, typename F>
inline constexpr int tuple_for(const std::tuple<Ts...>& t, const F& func) {
    func(std::get<N>(t));

    if constexpr(N < sizeof...(Ts) - 1) {
        return tuple_for<N + 1, Ts...>(t, func);
    } else {
        return 0;
    }
}

auto do_checks = [](const auto& t) {
    static_assert(has_some_method_v<decltype(t)>,
            "You need some_method");
    return 0;
}

[[maybe_unused]]
constexpr int i_am_sad = tuple_for(my_tuple, do_checks);

还有其他方法可以实现这种行为吗? 也许是c ++ 17中的新东西?

谢谢。

编辑:请注意,由于这些检查将被泛化,因此我认为在函数中包含断言是正确的方法。

您可以在其他constexpr上下文中将其用作static_assert

static_assert((static_cast<void>(tuple_for(my_tuple, do_checks)), true), "!");

[注意]:如果要返回带有邪恶重载逗号的类,则强制转换为void

static_assert是一个声明语句 ,因此您可以在自由空间中对其进行修改。

无需功能。

这恰恰是用例。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM