इस स्निपेट पर विचार करें:

#include <boost/fusion/container/map.hpp>
#include <boost/fusion/sequence/intrinsic/at_key.hpp>
#include <boost/fusion/sequence/intrinsic/value_at_key.hpp>
#include <tuple>

struct MyEvents {
    struct EventA;
    struct EventB;
    using EventMap = boost::fusion::map<boost::fusion::pair<EventA, int>,
                                        boost::fusion::pair<EventB, double>>;
};

template <typename T>
struct GetTypes;

template <typename T>
struct GetTypes<boost::fusion::map<...>> {
    using type = std::tuple<...>;
};

int main() {
    using Map = typename MyEvents::EventMap;
    using AllKeys = GetTypes<Map>::type;

    return 0;
}

डेमो

मैं सभी प्रमुख प्रकारों को एक boost::fusion::map से एक std::tuple में एकत्रित करना चाहता हूं।

इस स्निपेट की कुंजियाँ MyEvents::EventA और MyEvents::EventB हैं, इसलिए AllKeys = std::tuple<MyEvents::EventA, MyEvents::EventB>

टेम्पलेट विशेषज्ञता के साथ कोई ऐसा कैसे कर सकता है? क्या मुझे किसी प्रकार की पुनरावर्ती कॉल की आवश्यकता है?

0
Juergen 20 अक्टूबर 2021, 12:13

1 उत्तर

सबसे बढ़िया उत्तर

आप T::first_type का उपयोग करके boost::fusion::pair का प्रमुख प्रकार प्राप्त कर सकते हैं।

template <typename T>
struct GetTypes;

template <typename... Pairs>
struct GetTypes<boost::fusion::map<Pairs...>> {
    using type = std::tuple<typename Pairs::first_type...>;
};

डेमो।

2
康桓瑋 20 अक्टूबर 2021, 12:20