Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在元函数定义中使用mpl::vector_C++_Templates_Metaprogramming - Fatal编程技术网

C++ 在元函数定义中使用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> >,

我有元功能纤维。它计算对应于斐波那契序列中的数字(参数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;
模板
结构光纤:
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)
转换,不适用于递归序列