gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:51:57 29 4
gpt4 key购买 nike

我有元函数 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com