আমরা কি সি ++ ২০ এ দেখুন সহ ধারকগুলি তৈরি করতে সক্ষম হব?


10

C ++ 20 স্ট্যান্ডার্ড সংস্করণ সহ রেঞ্জগুলি সি ++ এ আসছে।

আমার প্রশ্ন: আমরা কি কোনও সীমা সহ স্ট্যান্ডার্ড-লাইব্রেরি পাত্রে (বিদ্যমান) তৈরি করতে সক্ষম হব? এবং আরও গুরুত্বপূর্ণ, পরিসরের দৃষ্টিভঙ্গি সহ?

উদাহরণস্বরূপ, এটি কি:

#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 লাইব্রেরির সাথে সংকলন করে।



প্রতি স্টোরি টেলেলার: আসন্ন রেঞ্জের লাইব্রেরি কেন পরিসীমা থেকে কোনও পরিসীমা থেকে আরম্ভের সমর্থন করে না এর আপাত নকল ? তবে নোট করুন যে ব্যালট রেজোলিউশনের উত্তর এখনও বদলে যেতে পারে!
ডেভিস হেরিং 15

পুনঃটুইট করেছেন P1206 20 শুরু করার জন্য বিবেচনা করা হয়নি এবং আমি মনে করি না এখানে কোনও NB মন্তব্য খোলা আছে? P1391 ব্যাপ্তি নির্মাণকারী (বিভ্রান্তিকর উদাহরণ সত্ত্বেও) ছাড়াই গৃহীত হয়েছিল ।
ব্যারি 16

@ ব্যারি: এলডব্লিউজি এটিকে কোনাতে এগিয়ে দিয়েছে, তবে আমার ধারণা আমি এ সম্পর্কে সাম্প্রতিক প্রতিচ্ছবি ট্র্যাফিকের ভুল ব্যাখ্যা করেছি in
ডেভিস হেরিং 16

@ ডেভিস হেরিং ওহ, আমি মিস করেছি যে এটি নিয়ে দুবার আলোচনা হয়েছিল - আমি 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
@ এরিকনিবলার ঠিক :-) তাদের দেখতে একই রকম দেখাচ্ছে। তারা একই নয়।
ব্যারি

সুতরাং, আমার প্রোগ্রামটি সংকলন করে তবে আমার যা মনে হয় তা তা করবে না। ঠিক আছে.
einpoklum

1
ধন্যবাদ, সিটিএডি ...
টিসি

আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন vএবং wপৃথক? কনস্ট্রাক্টর টেমপ্লেট আর্গুমেন্ট ছাড়ের কাজ কীভাবে এটির কিছু করার আছে?
জোহানেস স্কাউব -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.