क्या हम C ++ 20 में विचारों वाले कंटेनरों का निर्माण कर पाएंगे?


10

C ++ 20 मानक संस्करण के साथ C ++ में रेंज आ रहे हैं।

मेरा प्रश्न: क्या हम किसी भी सीमा के साथ (मौजूदा) मानक-पुस्तकालय कंटेनरों का निर्माण करने में सक्षम होंगे? और अधिक महत्वपूर्ण बात, श्रेणी के विचारों के साथ?

उदाहरण के लिए, यह होगा:

#include <vector>
#include <iostream>
#include <ranges>

int main() {
    auto sq = [](int x) { return x * x; };
    std::vector<int> vec { 3, 4, 5 };
    std::vector<int> squares { std::ranges::views::transform(vec, sq) };
    for(auto i : squares) { std::cout << i << ' '; }
    std::cout << std::endl;
}

एक वैध कार्यक्रम है जो प्रिंट करता है 9 16 25?

यह पर्वतमाला-वी 3 पुस्तकालय के साथ संकलित करता है , जो इसके लायक है।



प्रति स्टोरीटेलर: स्पष्ट डुप्लिकेट क्यों आगामी रेंज्स लाइब्रेरी एक सीमा से कंटेनर आरंभीकरण का समर्थन नहीं करता है? -लेकिन ध्यान दें कि मतपत्र संकल्प अभी भी उत्तर बदल सकता है!
डेविस हेरिंग

@DavisHerring क्या बदल सकता है? P1206 को 20 के साथ शुरू करने के लिए नहीं माना गया था और मुझे नहीं लगता कि यहां कोई भी एनबी टिप्पणियां खुली हुई हैं? P1391 को रेंज कंस्ट्रक्टर (भ्रामक उदाहरण के बावजूद) के बिना अपनाया गया था ।
बैरी

@ बैरी: LEWG तो इसे आगे बढ़ाया Kona, लेकिन मुझे लगता है कि मैं इसके बारे में हाल ही में परावर्तक यातायात गलत व्याख्या की।
डेविस हेरिंग

@DavisHerring ओह, मैंने याद किया कि यह दो बार चर्चा में था - मैंने 4-7 चुनाव तक नीचे स्क्रॉल किया और सोचा कि यह वही था।
बैरी

जवाबों:


8

मेरा प्रश्न: क्या हम किसी भी सीमा के साथ (मौजूदा) मानक-पुस्तकालय कंटेनरों का निर्माण करने में सक्षम होंगे? और अधिक महत्वपूर्ण बात, श्रेणी के विचारों के साथ?

नहीं। एकमात्र मानक पुस्तकालय घटक जो एक मनमाना सीमा से रचनात्मक है जो सही मानदंडों को पूरा करता है std::span<T>

जिस दिशा में मानक पुस्तकालय जाने की संभावना है, वह वह है जो रेंज-वी 3 की ओर भी जा रहा है (ध्यान दें कि रेंज-वी 3 से जुड़ा उदाहरण संकलन करता है लेकिन एक पदावनत रूपांतरण पर चेतावनी देता है) - आपके साथ रूपांतरण करने के लिए एक सहायक का उपयोग करना

std::vector<int> squares =
    std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;

रेंज कंस्ट्रक्टर्स की दिशा में नहीं जाने के कारणों में से एक को आपके द्वारा उपयोग किए जा रहे उदाहरण से देखा जा सकता है:

std::vector<int> squares { std::ranges::views::transform(vec, sq) };

विचार करें कि इन दोनों से कितना अलग है:

std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );

vआवश्यक रूप से एक vector<transform_view<...>>युक्त एक होगा transform_view, जबकि wएक होगा vector<int>

इसके अलावा, मानक पुस्तकालय में अधिक सावधानीपूर्वक कंटेनर निर्माणकर्ताओं को जोड़ने से तीसरे पक्ष के कंटेनर प्रकारों की वैसे भी मदद नहीं हो रही है - जबकि एक सुविधा जैसी ranges::toसभी मामलों में पूरी तरह से काम करती है।


बयानों को शुरू करने vऔर wमेरे लिए एक ही लग रहा है। शायद आप wएक के रूप में घोषित करने के लिए थे vector<int>। अन्यथा, यह सही उत्तर है।
एरिक निबलर

5
@EricNiebler बिल्कुल :-) वे एक ही दिखते हैं । वे एक जैसे नहीं हैं।
बैरी

इसलिए, मेरा कार्यक्रम संकलित करता है, लेकिन ऐसा नहीं होगा जो मुझे लगता है कि यह करता है। ठीक है।
einpoklum

1
धन्यवाद, CTAD ...
TC

क्या आप कृपया बता सकते हैं कि क्यों vऔर wअलग हैं? क्या इसका कुछ करना है कि कंस्ट्रक्टर टेम्प्लेट लॉजिक डिडक्शन कैसे काम करता है?
जोहान्स शाउब - १२
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.