c++ - 在元函数定义中使用 mpl::vector

标签 c++ templates metaprogramming

我有元函数 FibIter。它计算与斐波那契数列中的数字(参数 Iter)对应的斐波那契数。然后我使用 mpl::transform 创建具有从 0 到 N 的斐波那契数列的 mpl::vector。我已经编写了代码:

template <typename F1, typename F2, typename Iter>
struct FibIter :
    mpl::if_
    <
        mpl::equal_to <Iter, mpl::int_ <0> >,
        F1,
        FibIter <F2, mpl::plus<F1, F2>, mpl::minus <Iter, mpl::int_ <1> > >
    >::type
{ };

const int N = 22;

typedef mpl::range_c <int, 0, 22> Numbers;

typedef
    mpl::transform
    <
        Numbers,
        FibIter <mpl::int_ <0>, mpl::int_ <1>, mpl::_ >,
        mpl::back_inserter
        <
            mpl::vector <>
        >
    >::type
FibSeq;

但是,这并不好。因为 FibSeq 中的每个数字都从 0 开始一次又一次地计算。 我想在 FibIter 定义之前递归地创建 mpl::vector 和 push_back 数字。 我该怎么做?请帮忙。

最佳答案

MPL 和元编程通常依赖于回避——您可能已经知道这一点。但是 transform 不适合这样做。提出你的问题,例如。

// Untested!!!!

template<int N>
struct fib {
  // guard against bad N value
  BOOST_STATIC_ASSERT((N > 1));
  // previous f(0:N-1) values
  typedef typename fib<N-1>::vector previous;
  // current value, f(N) = f(N-1) + f(N-2)
  static const int value = (
    mpl::at_c<previous, N-1>::type::value +
    mpl::at_c<previous, N-2>::type::value
  );
  // append f(N) to F(0:N-1)
  typedef typename mpl::push_back<previous, mpl::int_<value> >::type vector;
};

// corner case, N=0
template<>
struct fib<0> {
  static const int value = 0;
  typedef mpl::vector_c<int,0> vector;
};

// corner case, N=1
template<>
struct fib<1> {
  static const int value = 1;
  typedef mpl::vector_c<int,0,1> vector;
};

BOOST_STATIC_ASSERT(( mpl::back< typename fib<10>::vector >::type::value == 55 ));

关于c++ - 在元函数定义中使用 mpl::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799294/

相关文章:

c++ - printf 和 strftime 的无效参数错误

C++ 将选项(的子集)传递给函数的优雅方式

c++ - OpenGL 3.0 中 glDrawPixels 的替代品?

javascript - 如何使用常见的 try-catch 来处理 Javascript 中的每个给定函数?

scheme - Racket "eval"一个数据

c++ - 如何动态调整二维 vector 的大小?

c++ - 无法推断 'TYPE' 的模板参数

c++ - Qt Creator 重构和 C++ 模板

javascript - Backbone Handlebars 变量返回 0(零)

ecmascript-6 - 在 ES6 中通过 Proxy 捕获类定义