gpt4 book ai didi

c++ - 用于constexpr函数中的constexpr

转载 作者:行者123 更新时间:2023-12-02 10:32:58 28 4
gpt4 key购买 nike

我正在编写constexpr函数,需要使用constexpr。可以手动手动扩展该循环,但是我发现代码很丑陋且多余。

如何制作“constexpr for”?

我应该参加辅助类(class)吗?如果是这样,我将如何写这样的东西:

#define for_constexpr( TYPE, VAR, START, CONDITION, END_OP, BODY ) \
for_constexpr_helper< \
TYPE, START, // TYPE START = 0; \
[ ]( TYPE VAR ) constexpr { return CONDITION; }, \
[ ] constexpr { END_OP; }, \
[ & ]( TYPE VAR ) constexpr { BODY; } >( )

用法就像
int x = 0;
for_constexpr( int, i, 0, i < 3, ++i, x += i * 2 );

更具体地说,如何在constexpr上下文(例如模板参数)中使用 i

我有什么选择?

示例代码:
auto ret = 0;
for ( int i = 0; i < 3; ++i )
{
static_assert( i != 4 ); // just an example
ret += i;
}
return ret;

这不能是constexpr。丑陋的例子:
auto ret = 0;
ret += 1;
ret += 2;
ret += 3;
return ret; // works

最佳答案

我不会使用宏来做到这一点。如果您可以通过“传递”循环变量很好

template <std::size_t i>
struct foo{
constexpr void operator()() {
static_assert(i != 3);
}
};

就是将静态循环的主体放在 operator()内,则可以使用以下代码:
template<template <std::size_t> class F, std::size_t... I>
auto static_for_impl(std::index_sequence<I...>)
{
(F<I>()(),...);
}


template<std::size_t N,template <std::size_t> class F,typename Indices = std::make_index_sequence<N>>
constexpr void static_for(){
static_for_impl<F>(Indices{});
}

用法:
int main() {    
static_for<5,foo>();
}

Live Example

另外,您也可以使用 std::integral_constant<std::size_t, N>作为参数,这样它就可以与lambdas一起使用,并且不需要编写类模板(贷记到@Artyer):
#include <cstddef>
#include <utility>

template<typename F, std::size_t... I>
auto static_for_impl(F&& f, std::index_sequence<I...>) {
(static_cast<void>(f(std::integral_constant<std::size_t, I>{})), ...);
}

template<std::size_t N, typename F>
constexpr void static_for(F&& f) {
static_for_impl<F>(std::forward<F>(f), std::make_index_sequence<N>{});
}

int main() {
static_for<5>([](auto i) {
static_assert(i != 5);
});
}

Live Example

在C++ 20中,您可以使用模板lambda(贷记到@ Jarod42):
#include <functional>
#include <utility>

template<std::size_t N, typename F>
constexpr void static_for(F&& f) {
[&f]<std::size_t...Is>(std::index_sequence<Is...>){
(static_cast<void>(f(std::integral_constant<std::size_t, Is>{})), ...);
}(std::make_index_sequence<N>{});
}

int main() {
static_for<5>([](auto i) {
static_assert(i != 5);
});
}

Live Example

关于c++ - 用于constexpr函数中的constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61599661/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com