7

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

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

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

Loki 库有一个“应用”函数,这或多或少是我正在寻找的——它通过将指向类型列表中的类型的指针作为参数传递来解决实例化问题,以帮助推断,但不做完全实例化。我应该在 MPL 中查看什么来获得该功能?还是我错过了一些明显的东西?

4

3 回答 3

8

您可以将for_each “重载”与 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() );
于 2011-12-30T03:23:31.423 回答
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());
}
于 2011-12-29T18:47:04.857 回答
0

在 MPL 中做同样的事情:调用boost::mpl::transformwithboost::add_pointer来创建一系列指向你的类型的指针,然后使用boost::mpl::for_each.

于 2011-12-29T18:40:39.477 回答