2011-12-29 15 views
7

Mam funkcji, które chcę wykonać na wszystkich typów w typelist (obecnie reprezentowany przez listy mpl --- jest to nawet rozsądny sposób do niego zbliżyć?)boost :: mpl aplikacja funkcja typelist

Kluczem jest to, że funkcja tylko dba o typ, a nie rzeczywiste dane; wywołuje funkcję statyczną w tym typie w celu pobrania niektórych informacji, a następnie przenosi ją do tabeli mieszania, aby można ją było później wykorzystać.

Jednak, o ile mogę powiedzieć, mpl nie ma możliwości robienia tego --- najbliższy mogę znaleźć operator mpl for_each, ale wydaje się, że chce być użyty na rzeczywistych wystąpieniach każdego typów, a nie samych typów.

Biblioteka Loki ma funkcję "stosuj", co jest mniej więcej tym, czego szukam - rozwinęła problem związany z tworzeniem instancji, przekazując wskaźnik do typu w liście typów jako parametr pomagający w odliczeniu, ale nie robi pełnej instancji. Co powinienem oglądać w MPL, aby uzyskać tę funkcjonalność? Czy może brakuje mi czegoś oczywistego?

+0

można użyć C++ 11? Jeśli nie, to uważam, że MPL jest jedyną drogą bez ponownego wymyślania wszystkiego. (Możesz też użyć makr ...) – kennytm

+0

@Kenny: Myślę, że MPL nie * zapewnia * pożądanej funkcjonalności. – Xeo

Odpowiedz

8

Można użyć for_each "overload" with TransformOp uniknąć instancji tych typów:

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

mpl::for_each<types, mpl::make_identity<_> >(functor()); 
+0

Skończyłem z tym - wydaje mi się, że działa dokładnie tak, jak reklamowano i ma dla mnie więcej sensu. Dziękuję bardzo! – Kozaki

0

Wykonaj to samo w MPL: wywołaj boost::mpl::transform z boost::add_pointer, aby utworzyć ciąg wskaźników do typów, a następnie użyj boost::mpl::for_each.

3

Najprostszym rozwiązaniem właśnie może być tylko to:

#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()); 
} 
Powiązane problemy