2011-06-17 25 views
3

我曾预计以下给出相同的结果:意想不到的结果使用升压MPL插入迭代器

namespace mpl = boost::mpl; 

template<int from, int to> 
struct 
make_vector1 
: mpl::copy< 
    mpl::range_c<int,from,to>, 
    mpl::inserter< 
     mpl::vector<>, 
     mpl::push_back<mpl::placeholders::_1, 
       mpl::placeholders::_2 // <- Copy int_ types 
      > 
     > 
    > 
{}; 

template<int from, int to> 
struct 
make_vector2 
: mpl::copy< 
    mpl::range_c<int,from,to>, 
    mpl::inserter< 
     mpl::vector<>, 
     mpl::push_back<mpl::placeholders::_1, 
       mpl::int_<mpl::placeholders::_2::value> // <- Alternative? 
       > 
     > 
    > 
{}; 

但他们没有。

int 
main (int ac, char **av) 
{ 
    typedef make_vector1<0,3>::type v1; 
    typedef make_vector2<0,3>::type v2; 

    //returns 0, as I would expect 
    std::cout<<"I1 = "<<mpl::at<v1,mpl::int_<0> >::type::value <<std::endl; 

    //returns 2, which has me stumpted. 
    std::cout<<"I2 = "<<mpl::at<v2,mpl::int_<0> >::type::value <<std::endl; 
} 

任何想法这里发生了什么?

我想用第二种方法来构造Example类型,其中的MPL ::向量:

template<int i> 
struct Example : mpl::int_<i> 
{}; 

,但我无法得到它的工作。

非常感谢

回答

4

你得到一个2,因为::上_2值被定义为2(占位指数)。 MPL没有在占位符上定义::明显的原因,所以你不能直接做到这一点。

现在,访问mpl :: range_c中的元素已经为您提供了mpl :: int_,因为您已经注意到了,所以不需要尝试提取数字值以将其放回。通过mpl序列进行迭代的抽象工作可以帮助你。

对于您的实际使用情况,您可以使用采用mpl :: int_并返回示例的元函数。你必须把握没有适当的通用元编程也不元lambda函数可以使用整型来完成,因此MPL :: int_抽象:

#include <boost/mpl/at.hpp> 
#include <boost/mpl/copy.hpp> 
#include <boost/mpl/vector.hpp> 
#include <boost/mpl/range_c.hpp> 
#include <boost/mpl/push_back.hpp> 

namespace mpl = boost::mpl; 

template<int I> struct Example : boost::mpl::int_<I> 
{ 
    static void foo() { std::cout << "**" << I << "**\n";} 
}; 

template<class T> struct make_example 
{ 
    typedef Example<T::value> type; 
}; 

template<int from, int to> 
struct 
make_vector2 
: mpl::copy< 
    mpl::range_c<int,from,to>, 
    mpl::inserter< 
     mpl::vector<>, 
     mpl::push_back<mpl::placeholders::_1, 
       make_example<mpl::placeholders::_2> // <- Alternative? 
       > 
     > 
    > 
{}; 

int main(int ac, char **av) 
{ 
    typedef make_vector2<0,3>::type v2; 

    mpl::at<v2,mpl::int_<0> >::type::foo(); 
} 

我加富()只是为了评估我们进入调用at后的正确类的类型。

因此,让我们回顾一下:

  • 整体模板参数是不可靠的,这就是为什么MPL使用int_。每个整型常量序列实际返回int_已经保持了抽象级别。
  • 占位符有内部用途的::值,因此您的初始结果
  • 任何元函数通过使用占位符实例化变成lambda表达式。
+0

Ace!很好的答案 - 我现在明白 - 它是一种享受。谢谢 – Tom 2011-06-17 12:54:42