我有一个函数,我想对类型列表中的所有类型执行(目前由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
。