Kisaran datang ke C ++ dengan versi standar C ++ 20.
Pertanyaan saya: Apakah kami dapat membuat wadah perpustakaan standar (yang ada) dengan jangkauan apa pun? Dan yang lebih penting, dengan berbagai tampilan?
Misalnya, apakah ini:
#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;
}
menjadi program yang valid yang mencetak 9 16 25
?
Ini mengkompilasi dengan perpustakaan rentang-v3 , untuk apa itu layak.
Jawaban:
Tidak. Satu-satunya komponen perpustakaan standar yang dapat dibangun dari rentang arbitrer yang memenuhi kriteria yang benar adalah
std::span<T>
.Arah pustaka standar kemungkinan akan mengarah ke rentang-v3 juga menuju (perhatikan bahwa contoh terkait dari rentang-v3 mengkompilasi tetapi memperingatkan tentang konversi yang ditinggalkan) - menggunakan penolong untuk melakukan konversi untuk Anda:
Salah satu alasan untuk tidak menggunakan arahan konstruktor dapat dilihat dari contoh yang Anda gunakan:
Pertimbangkan betapa berbedanya deklarasi itu dari keduanya:
v
tentu akan menjadi yangvector<transform_view<...>>
mengandung tunggaltransform_view
, sementaraw
akan menjadivector<int>
.Selain itu, menambahkan lebih banyak, konstruktor kontainer yang dibatasi dengan hati-hati ke perpustakaan standar tidak akan membantu jenis kontainer pihak ketiga - sementara fasilitas seperti
ranges::to
berfungsi dengan sangat baik dalam semua kasus.sumber
v
danw
terlihat sama bagi saya. Mungkin Anda bermaksud menyatakanw
sebagaivector<int>
. Kalau tidak, ini jawaban yang benar.v
danw
berbeda? Apakah ada hubungannya dengan cara deduksi argumen template konstruktor bekerja?