Boost::mpl类型列表函数应用程序



我有一个函数,我想对类型列表中的所有类型执行(目前由mpl列表表示——这是一种合理的方法吗?)

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

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

Loki库有一个"apply"函数,这或多或少是我正在寻找的——它通过传递一个指向类型列表中的类型的指针作为参数来帮助演绎,但没有进行完整的实例化,从而解决了实例化问题。我应该在MPL中看到什么来获得该功能?还是我错过了什么明显的东西?

你可以使用for_each "overload"来避免实例化这些类型:

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

最简单的选择可能就是:

#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());
}

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

最新更新