C ++ 20'de görünümleri olan kaplar oluşturabilecek miyiz?


10

C ++ 20 standart sürümü ile aralıklar C ++ 'a geliyor.

Benim sorum: Herhangi bir aralıkta standart kütüphane kapları (mevcut) oluşturabilecek miyiz? Ve daha da önemlisi, menzil görünümleriyle?

Örneğin, bu:

#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;
}

geçerli bir program olabilir 9 16 25mi?

Bu değer için ranges-v3 kütüphanesi ile derlenir .



StoryTeller Başına: Yaklaşan Aralıklar kitaplığının neden bir aralıktan kapsayıcı başlatmayı desteklemediğini görünen yinelenen kopyası —Ama oy pusulasının henüz cevabı değiştirebileceğini unutmayın!
Davis Herring

@DavisHerring Ne değişebilir? P1206 , 20 ile başlamak için düşünülmedi ve burada açık kalan herhangi bir NB yorumu olduğunu düşünmüyorum? P1391 , menzil oluşturucu olmadan kabul edildi (yanıltıcı örneğe rağmen).
Barry

@Barry: LEWG bunu Kona'da iletti , ama sanırım son reflektör trafiğini yanlış yorumladım.
Davis Herring

@DavisHerring Oh, bunun iki kez tartışıldığını kaçırdım - 4-7 ankete ilerledim ve bunun olduğunu düşündüm.
Barry

Yanıtlar:


8

Benim sorum: Herhangi bir aralıkta standart kütüphane kapları (mevcut) oluşturabilecek miyiz? Ve daha da önemlisi, menzil görünümleriyle?

Hayır. Doğru ölçütleri karşılayan rasgele bir aralıktan oluşturulabilen tek standart kitaplık bileşeni std::span<T>.

Standart kitaplığın büyük olasılıkla gideceği yön, aralık-v3'ün de gideceği yöndür (aralık-v3'ün bağlantılı örneğinin derlendiğini, ancak kullanımdan kaldırılmış bir dönüşümle ilgili uyarıldığını unutmayın) - sizin için dönüşüm yapmak için bir yardımcı kullanarak :

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

Menzil kurucuları yönünde gitmemenizin nedenlerinden biri, kullandığınız örnekten görülebilir:

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

Bu bildirimin bu ikisinden ne kadar farklı olduğunu düşünün:

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

vmutlaka vector<transform_view<...>>tek bir içeren transform_view, wbirvector<int> .

Dahası, standart kütüphaneye daha fazla, dikkatle kısıtlanmış konteyner kurucuları eklemek üçüncü taraf konteyner türlerine yine de yardımcı olmaz - buna benzer bir tesis ranges::toher durumda mükemmel çalışır.


İfadeler başlatılıyor vve wbana benziyor. Belki wde bir vector<int>. Aksi takdirde, doğru cevap budur.
Eric Niebler

5
@EricNiebler Tam olarak :-) Aynı görünüyorlar . Aynı değiller.
Barry

Yani, programım derler ama ne düşündüğümü yapmaz. Tamam.
einpoklum

1
Teşekkürler, CTAD ...
TC

Neden vve wfarklı olduklarını açıklayabilir misiniz ? Yapıcı şablon bağımsız değişkeninin kesinti ile nasıl bir ilgisi var?
Johannes Schaub - litb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.