大佬教程收集整理的这篇文章主要介绍了c – 循环替换模板,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template<std::size_t D = 3> class Deriv { public: typedef typename boost::array<double,D> results_t; template<typename Iterator> results_t operator()(Iterator& objIterator) { double u; double um1; results_t derivs; for(results_t::index i = 0; i < D; ++i) { u = *objIterator; um1 = *(objIterator.left<i>(1)); derivs[i] = u-um1; } } }; };
所以,它看起来有点令人困惑,但它使用的是具有左右模板方法的自定义迭代器,其中模板参数是向左或向右移动的维度,参数是偏移量.例如,如果objIterator指向array [i] [j] [k],则objIterator.left< 0>(1)将迭代器返回到数组[i-1] [j] [k].
显然我发布的内容不起作用,因为我不是编译时间,不能用作左边的参数.我觉得这里可以使用递归来以某种方式通过替换for循环来实现这一点,但我不知道如何.
有什么建议?
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,那么以下内容应该没问题:
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 – 循环替换模板所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。