C++ 在元函数定义中使用mpl::vector
我有元功能纤维。它计算对应于斐波那契序列中的数字(参数Iter)的斐波那契数。然后,我使用mpl::transform创建具有从0到N的斐波那契序列的mpl::vector。我编写了以下代码:C++ 在元函数定义中使用mpl::vector,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我有元功能纤维。它计算对应于斐波那契序列中的数字(参数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> >,
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;
模板
结构光纤:
mpl::如果_
<
mpl::等于,
F1,
纤维工
>::类型
{ };
常数int N=22;
typedef mpl::范围_c编号;
类型定义
转换
<
数字,
菲比特,
mpl::背面插入器
<
向量
>
>::类型
FibSeq;
但是,这并不好。因为FibSeq中的每个数字都从0开始一次又一次地计算。
我想在FibIter之前创建mpl::vector,并在FibIter定义内递归地将数字推回。
我怎么做?请提供帮助。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 ));
//未经测试!!!!
模板
结构纤维{
//警惕坏N值
BOOST_STATIC_ASSERT((N>1));
//以前的f(0:N-1)值
typedef typename fib::vector previous;
//当前值,f(N)=f(N-1)+f(N-2)
静态常量int值=(
mpl::at_c::type::value+
mpl::at_c::type::value
);
//将f(N)追加到f(0:N-1)
typedef typename mpl::push_back::type vector;
};
//角盒,N=0
模板
结构纤维{
静态常量int值=0;
typedef mpl::vector_c vector;
};
//角盒,N=1
模板
结构纤维{
静态常数int值=1;
typedef mpl::vector_c vector;
};
BOOST_STATIC_ASSERT((mpl::back::type::value==55));
您真的希望这样做吗mpl::transform
通常用于t->f(t)
转换,不适用于递归序列