在编译时触发 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 中的新内容?
谢谢。
编辑:
请注意,由于这些检查是通用的,我相信在函数中使用断言是正确的方法。
static_assert
是一个 声明语句 ,因此您可以免费输入 space.
不需要函数。
这正是它的用例。 :)
您可以在其他 constexpr 上下文中使用它作为 static_assert
:
static_assert((static_cast<void>(tuple_for(my_tuple, do_checks)), true), "!");
[注意]:转换为 void
是为了泛化,如果你想 return class 带有邪恶的重载逗号。
我有一个 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 中的新内容?
谢谢。
编辑: 请注意,由于这些检查是通用的,我相信在函数中使用断言是正确的方法。
static_assert
是一个 声明语句 ,因此您可以免费输入 space.
不需要函数。
这正是它的用例。 :)
您可以在其他 constexpr 上下文中使用它作为 static_assert
:
static_assert((static_cast<void>(tuple_for(my_tuple, do_checks)), true), "!");
[注意]:转换为 void
是为了泛化,如果你想 return class 带有邪恶的重载逗号。