2011-12-29 16 views
7

मैं एक समारोह है कि मैं एक typelist में सभी प्रकार पर प्रदर्शन करने के लिए चाहते हैं (वर्तमान में एक एमपीएल सूची का प्रतिनिधित्व करती --- यह और भी एक उचित यह दृष्टिकोण तरीका है?)बढ़ावा :: एमपीएल typelist समारोह आवेदन

है

यहां कुंजी यह है कि फ़ंक्शन केवल उस प्रकार की परवाह करता है, वास्तविक डेटा नहीं; यह उस जानकारी में कुछ जानकारी पुनर्प्राप्त करने के लिए एक स्थिर फ़ंक्शन को कॉल करता है और फिर बाद में संदर्भ के लिए इसे हैश तालिका में डाल देता है।

हालांकि, जहां तक ​​मैं कह सकता हूं, एमपीएल के पास ऐसा करने का साधन नहीं है --- निकटतम मुझे मिल सकता है mpl for_each ऑपरेटर है, लेकिन ऐसा लगता है कि प्रत्येक के वास्तविक तत्काल प्रकारों के प्रकार, खुद के प्रकार नहीं।

लोकी लाइब्रेरी में "लागू" फ़ंक्शन था, जो कि मैं जितना कम या कम खोज रहा हूं - यह कटौती में सहायता के लिए पैरामीटर के रूप में टाइपलेटर को टाइप करने के लिए तत्काल समस्या के आसपास हो गया है, लेकिन एक पूर्ण तत्काल नहीं कर रहा है। उस कार्यक्षमता को पाने के लिए मुझे एमपीएल में क्या देखना चाहिए? या क्या मुझे कुछ याद आ रही है?

+0

आप सी ++ 11 का उपयोग कर सकते हैं? यदि नहीं, तो मेरा मानना ​​है कि एमपीएल सब कुछ पुनर्निर्मित किए बिना एकमात्र तरीका है। (या आप मैक्रोज़ का उपयोग कर सकते हैं ...) – kennytm

+0

@ केनी: मुझे लगता है कि बिंदु यह है कि एमपीएल * कार्यक्षमता प्रदान नहीं करता * कार्यक्षमता प्रदान करता है। – Xeo

उत्तर

8

आप for_each "overload" with TransformOp का उपयोग प्रकार instantiating से बचने के लिए कर सकते हैं:

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

0

एमपीएल में वही काम करें: 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()); 
} 
संबंधित मुद्दे