किसी दिए गए std::tuple
और उसके उप-टुपल्स (यदि कोई तत्व भी एक ट्यूपल है) में शामिल सभी प्रकारों को शामिल करने के लिए std::variant
प्रकार घोषित करने के लिए किस तकनीक का उपयोग करने के बारे में एक विचार की आवश्यकता है।
उदाहरण के लिए,
std::tuple<int, std::tuple<int, double, std::tuple<float, double, std::string>>>
में बदल जाता है
std::variant<int, double, float, std::string>
संक्षेप में, मुझे सभी अद्वितीय प्रकारों को std::variant
में शामिल करने की आवश्यकता है।
1 उत्तर
Boost.Mp11 के साथ, यह इतना बुरा नहीं है।
पहला कदम इनपुट सूची को पुनरावर्ती रूप से समतल करना है। हमारे पास mp_flatten
है, लेकिन यह केवल एक ही समतल करता है - हमें इसे पुनरावर्ती रूप से लागू करने की आवश्यकता है। ऐसा करने का एक बेहतर तरीका हो सकता है, लेकिन अब तक जो सबसे अच्छा मैंने पाया है वह mp_iterate
का उपयोग एक ऐसे फ़ंक्शन के साथ करना है जो केवल तभी होता है जब वह कुछ करता है:
// maybe_flatten succeeds only if it actually flattens
// (once we're flat, it's ill-formed, we use that a terminating condition for mp_iterate)
template <typename L,
typename U=mp_flatten<L>,
typename = std::enable_if_t<not mp_same<L, U>::value>>
using maybe_flatten = U;
template <typename L>
using recursive_flatten = mp_back<mp_iterate<L, mp_identity_t, maybe_flatten>>;
एक बार हमारे पास recursive_flatten
हो जाने के बाद, हमें केवल यह सुनिश्चित करने की आवश्यकता है कि प्रकार अद्वितीय हैं और इसका नाम बदलकर भिन्न करें:
template <typename L>
using to_variant = mp_rename<mp_unique<recursive_flatten<L>>, std::variant>;
डेमो।
मैं यहां एक थ्रेडिंग मेटाफंक्शन के साथ प्रयोग कर रहा हूं (एक ला क्लोजर का ->
) ताकि आप क्रम में आने वाले कार्यों को लिख सकें। मुझे यकीन नहीं है कि यह बेहतर है:
template <typename L>
using recursive_flatten2 = thread<
mp_iterate<L, mp_identity_t, maybe_flatten>,
mp_back>;
template <typename L>
using to_variant2 = thread_q<
L,
mp_quote<recursive_flatten2>,
mp_quote<mp_unique>,
mp_bind_q<mp_quote<mp_apply_q>, mp_quote<std::variant>, _1>
>;
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।