【问题标题】:boost::mpl typelist function applicationboost::mpl typelist 函数应用
【发布时间】:2011-12-29 17:44:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你会用 C++11 吗?如果不是,我相信 MPL 是唯一不需要重新发明一切的方法。 (或者你可以使用宏......)
  • @Kenny:我认为关键在于 MPL 确实提供这里想要的功能。

标签: c++ boost-mpl typelist


【解决方案1】:

您可以使用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() );

【讨论】:

  • 我最终选择了这个 --- 它似乎与宣传的完全一样,对我来说更有意义。非常感谢!
【解决方案2】:

最简单的选择可能就是这样:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多