所以,它看起来有点令人困惑,但它使用的是具有左右模板方法的自定义迭代器,其中模板参数是向左或向右移动的维度,参数是偏移量.例如,如果objIterator指向array [i] [j] [k],则objIterator.left< 0>(1)将迭代器返回到数组[i-1] [j] [k].
显然我发布的内容不起作用,因为我不是编译时间,不能用作左边的参数.我觉得这里可以使用递归来以某种方式通过替换for循环来实现这一点,但我不知道如何.
有什么建议?
解决方法 这是另一种方法: @H_419_11@template<std::size_t D = 3>struct Deriv{ typedef typename boost::array<double,D> results_t;private: template<std::size_t I> struct apply { template<typename Iterator> static voID impl(results_t& derivs,Iterator& iter) { derivs[I] = *iter - *iter.template left<I>(1); apply<I + 1>::impl(derivs,iter); } }; template<> struct apply<D> { template<typename Iterator> static voID impl(results_t&,Iterator&) { } };public: template<typename Iterator> results_t operator ()(Iterator& iter) const { results_t derivs; apply<0>::impl(derivs,iter); return derivs; }};我已经使用VC 2010进行了测试,但我怀疑它可能无法在更符合标准的编译器上进行编译.如果您可以从D-1倒数到0而不是从0倒数到D-1,那么以下内容应该没问题:
@H_419_11@namespace detail{ template<std::size_t I> struct apply { template<typename ResultsT,typename Iterator> static voID impl(ResultsT& derivs,Iterator& iter) { derivs[I] = *iter - *iter.template left<I>(1); apply<I - 1>::impl(derivs,iter); } }; template<> struct apply<0> { template<typename ResultsT,Iterator& iter) { derivs[0] = *iter - *iter.template left<0>(1); } };}template<std::size_t D = 3>struct Deriv{ typedef typename boost::array<double,D> results_t;public: template<typename Iterator> results_t operator ()(Iterator& iter) const { results_t derivs; detail::apply<D - 1>::impl(derivs,iter); return derivs; }}; 总结以上是内存溢出为你收集整理的c – 循环替换模板全部内容,希望文章能够帮你解决c – 循环替换模板所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)