fus*_*tee 3 c++ for-loop compile-time function-templates constexpr
给定一个函数print<size_t>(void)和 a ,我想要一个调用每个inconstexpr std::array<size_t,3> q={1,2,3}的循环。print<qi>qiq
我的最小示例如下所示:
#include<iostream>
#include<array>
template<size_t n>
void print(){ std::cout << n << "\n"; }
template< size_t N, const std::array<const size_t,N> q>
constexpr void print_long(){
//
// I) this is what I want to do
for(size_t i=0;i<N;++i){ print<q[i]>(); }
//
// II) this does not compile either (because "it++")
constexpr auto it = q.begin();
while(it!=q.end()){ print<*(it++)>(); }
//
// III) for_each is no constexpr either
std::for_each(q.begin(),q.end(),[](const auto& it){ print<it>(); });
}
int main(){
constexpr size_t N=3;
constexpr std::array<const size_t,N> q={1,2,3};
//
print_long<N,q>();
}
Run Code Online (Sandbox Code Playgroud)
我寻求一个干净、实用、简洁、可读、可维护的代码解决方案。
我尝试了 I、II、III 中的变体。我希望至少 III 可以工作,或者 std 中有一个实用的框架,用于在 constexpr 数组上运行编译时循环。
在 C++20 中,您可以:
template< size_t N, const std::array<const size_t,N> q>
constexpr void print_long() {
[]<std::size_t... Is>(std::index_sequence<Is...>) {
(print<q[Is]>(), ...);
}(std::make_index_sequence<N>{});
}
Run Code Online (Sandbox Code Playgroud)