2011-12-29 42 views
7

我有我想要的類型串上的所有類型的執行功能(目前由MPL列表代表---這是甚至接近它一個合理的方式?)的boost :: MPL類型列表功能應用

這裏的關鍵是函數只關心類型,而不關心實際數據;它調用該類型的靜態函數來檢索一些信息,然後將其推入散列表中供以後參考。

但是,據我所知,mpl沒有這樣做---最接近我能找到的是mpl for_each運算符,但它似乎想要用於每個實際的實例的類型,而不是類型本身。

Loki庫有一個「應用」函數,它或多或少是我正在尋找的 - 它通過傳遞指向類型列表中的類型的指針作爲參數來幫助扣減,解決了實例化問題,但沒有做一個完整的實例化。我應該在MPL中看到哪些功能?還是我錯過了明顯的東西?

+0

你可以使用C++ 11?如果沒有,我相信MPL是唯一不重新創造一切的方法。 (或者你可以使用宏...) – kennytm 2011-12-29 18:03:59

+0

@Kenny:我認爲重點是MPL不*提供這裏需要的功能。 – Xeo 2011-12-29 18:05:40

回答

8

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

我最終選擇了這款產品 - 它看起來和廣告完全一樣,對我來說更有意義。非常感謝! – Kozaki 2011-12-30 05:23:33

0

在MPL中做同樣的事情:調用boost::mpl::transformboost::add_pointer來製作指向您的類型的指針序列,然後使用boost::mpl::for_each

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