2011-12-29 67 views
7

我有我想要的类型串上的所有类型的执行功能(目前由MPL列表代表---这是甚至接近它一个合理的方式?)的boost :: MPL类型列表功能应用

这里的关键是函数只关心类型,而不关心实际数据;它调用该类型的静态函数来检索一些信息,然后将其推入散列表中供以后参考。

但是,据我所知,mpl没有这样做---最接近我能找到的是mpl for_each运算符,但它似乎想要用于每个实际的实例的类型,而不是类型本身。

Loki库有一个“应用”函数,它或多或少是我正在寻找的 - 它通过传递指向类型列表中的类型的指针作为参数来帮助扣减,解决了实例化问题,但没有做一个完整的实例化。我应该在MPL中看到哪些功能?还是我错过了明显的东西?

+0

你可以使用C++ 11?如果没有,我相信MPL是唯一不重新创造一切的方法。 (或者你可以使用宏...) – kennytm 2011-12-29 18:03:59

+0

@Kenny:我认为重点是MPL不*提供这里需要的功能。 – Xeo 2011-12-29 18:05:40

回答

8

您可以使用for_each "overload" with TransformOp避免实例化类型:

struct functor 
{ 
    template<class T> void operator()(mpl::identity<T>) 
    { 
     std::cout << typeid(T).name() << '\n'; 
    } 
}; 

mpl::for_each<types, mpl::make_identity<_> >(functor()); 
+0

我最终选择了这款产品 - 它看起来和广告完全一样,对我来说更有意义。非常感谢! – Kozaki 2011-12-30 05:23:33

0

在MPL中做同样的事情:调用boost::mpl::transformboost::add_pointer来制作指向您的类型的指针序列,然后使用boost::mpl::for_each

3

最简单的方法可能只是刚刚是这样的:

#include <boost/mpl/vector.hpp> 
#include <boost/mpl/transform.hpp> 
#include <boost/type_traits/add_pointer.hpp> 
#include <boost/mpl/placeholders.hpp> 
#include <boost/mpl/for_each.hpp> 
#include <typeinfo> 
#include <iostream> 

struct functor{ 
    template<class T> 
    void operator()(T*){ 
     std::cout << typeid(T).name() << '\n'; 
    } 
}; 

int main(){ 
    namespace mpl = boost::mpl; 
    using namespace mpl::placeholders; 
    typedef mpl::vector<char, int, float, bool> typelist; 
    typedef mpl::transform<typelist, boost::add_pointer<_1>>::type ptypelist; 
    mpl::for_each<ptypelist>(functor()); 
} 
相关问题