Boost :: MPL приложение функции списка - PullRequest
7 голосов
/ 29 декабря 2011

У меня есть функция, которую я хочу выполнить для всех типов в списке типов (в настоящее время представлен списком mpl - это даже разумный способ приблизиться к нему?)

Ключ здесьчто функция заботится только о типе, а не о реальных данных;он вызывает статическую функцию этого типа для извлечения некоторой информации, а затем помещает ее в хеш-таблицу для дальнейшего использования.

Однако, насколько я могу судить, mpl не имеет возможности сделать это--- ближе всего я могу найти оператор mpl for_each, но он, кажется, хочет использовать его в реальных экземплярах каждого из типов, а не в самих типах.

В библиотеке Loki было "apply"Функция, которая более или менее то, что я ищу, - обошла проблему создания экземпляров, передав указатель на тип в списке типов в качестве параметра, помогающего с выводом, но не выполняя полное создание экземпляров.Что я должен смотреть в MPL, чтобы получить эту функциональность?Или я что-то упускаю очевидное?

Ответы [ 3 ]

8 голосов
/ 30 декабря 2011

Вы можете использовать for_each "overload" с 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() );
3 голосов
/ 29 декабря 2011

Самым простым вариантом может быть просто:

#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());
}
0 голосов
/ 29 декабря 2011

Сделайте то же самое в MPL: вызовите boost::mpl::transform с boost::add_pointer, чтобы сделать последовательность указателей на ваши типы, а затем используйте boost::mpl::for_each.

...