c – 循环替换模板

c – 循环替换模板,第1张

概述我正在研究一个循环在一个潜在的多维数组上的东西,我遇到了一些模板问题.这是我想要做的事情的想法: template<std::size_t D = 3>class Deriv {public: typedef typename boost::array<double, D> results_t; template<typename Iterator> results_ 我正在研究一个循环在一个潜在的多维数组上的东西,我遇到了一些模板问题.这是我想要做的事情的想法:

@H_419_11@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循环来实现这一点,但我不知道如何.

有什么建议?

解决方法 这是另一种方法:

@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 – 循环替换模板所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230162.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存