我正在尝试编写一个可以接受边界的一般static_for实现,一个增量函数&一个运行循环的比较功能.我一直在使用这个结构,其简单的循环递增1.在这种情况下,通过专门从事IDX& END相等
但是,当增量可以是任意整数时,不能保证IDX& END将始终是相等的. if条件仅在运行时进行评估.在下面的代码片段中,我试图专注于停止递归的std :: false_type.通过评估std :: less功能(可以由用户替代任何其他评估)来构造integral_constant.不幸的是,此比较器功能也仅在运行时进行评估,因此编译器失败.有人建议如何让这个工作吗?
注意:使用C 11.
template <int idx,int end,typename eval,int count,typename comparator> struct static_for_loop { template <typename Lambda,typename... Args> void operator()(const Lambda& function,Args... args) const { if (comparator()(idx,end)) { std::integral_constant<int,idx> i; function(i,args...); constexpr bool lesser = comparator()(idx + count,end); static_for_loop<idx + count,end,std::integral_constant<bool,lesser>,count,comparator>()(function,args...); } } }; template <int idx,typename comparator> struct static_for_loop<idx,std::false_type,comparator> { template <typename Lambda,Args... args) const {} }; template <int idx,int count = 1,typename comparator = std::less<int>> struct static_for { template <typename Lambda,Args... args) const { static_for_loop<idx,std::true_type,args...); } };
解决方法
我发现将所有东西都包装在一个对象中更容易:
template <int S,int E,int step> struct iter { auto next() { return iter<std::min(E,S+step),E,step>{}; } };
然后你只是有一个超负荷的情况下,它的完成和不是的情况:
template <int S,int step,class F,class... Args> void for_loop(iter<S,step> i,F func,Args... args) { func(S,args...); for_loop(i.next(),func,args...); } template <int E,class... Args> void for_loop(iter<E,step>,F,Args... ) { }
例如:
// prints 0 4 8 for_loop(iter<0,10,4>{},[](int i){std::cout << i << ' ';});
或者,可以使用enable_if来区分这些情况,以避免min:
template <int S,class... Args> std::enable_if_t<(S<E)> for_loop(iter<S,Args... args) { func(S,args...); for_loop(iter<S+step,step>{},args...); } template <int S,class... Args> std::enable_if_t<!(S<E)> for_loop(iter<S,Args... ) { }
你喜欢的YMMV.