c – 循环替换模板
发布时间:2020-12-16 07:30:15 所属栏目:百科 来源:网络整理
导读:我正在研究一个循环在一个潜在的多维数组上的东西,我遇到了一些模板问题.这是我想要做的事情的想法: templatestd::size_t D = 3class Deriv {public: typedef typename boost::arraydouble,D results_t; templatetypename Iterator results_t operator()(It
我正在研究一个循环在一个潜在的多维数组上的东西,我遇到了一些模板问题.这是我想要做的事情的想法:
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; } }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |