如何在C编译时应用

前端之家收集整理的这篇文章主要介绍了如何在C编译时应用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个可以接受边界的一般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.

猜你在找的C&C++相关文章