Bu sorunun genel bir yanıtı olamaz.
Bir işlevinin, bir span<T>
gerektirdiğini söylemesi, herhangi bir sahiplik aktarımı olmadan bitişik bir değerler dizisi alması anlamına gelir. Bu açıklama ne olup bittiğini makul bir şekilde temsil etmiyorsa, o zaman span<T>
almamalıdır. Örneğin
:
Ne tampon bir dosyaya eşlenen diyelim ki, benim hafıza alanı, bir bölge kesişiyor olup olmadığını fonksiyon kontrolleri olur?
Bu, span<T>
gibi görünmüyor.
struct memory_region
{
void* p;
size_t size_in_bytes;
};
Hatta kavşakları test etmek için bunu bir üye işlev verebilir: ne anlama açıkça kılan bir adla basit agrega olmalıdır gibi geliyor. Eğer bu tür hafıza bölgeleriyle uğraşmak için bir sistem yapıyorsanız, kurucular ve benzerleri ile daha kapsüllenmiş bir sınıf türü tavsiye edebilirim.
İşlev ne tür bir işlevin ne anlama geldiğini açıklamalıdır. Tercihen bu anlam genel anlamda olacaktır, fakat en azından, söz konusu işlev için ne anlama geldiğini söylemelidir.
Bir şey daha:
veya span<uint8_t>
vb foo ima aslında karakter
Hayır
, değil mi bekler.
uint8_t
neredeyse
unsigned char
ile aynı boyuta sahip olsa da, bu bir karakter dizisini
span<uint8_t>
alan herhangi bir işleve iletebilmeyi bekleyeceği anlamına gelmez. Bu işlev kabul edilen karakterleri tanıtmak istediyse,
unsigned char
kullanmış olur.
Ben fonksiyonu
whatever
's beklemek ima
span<whatever>
demek istedim.
Evet, span
s için şartı verilen boyutta T
s, gerçek bir dizi geçirilir olmasıdır.
İşlev şablonunu doğru tipte yap? – Jarod42
Şablon int foo (T &&) 'yapar. –
@ Jarod42: Doğru bir tür olduğunu varsayalım. İşlev, arabelleğin bellek alanı içindeki bir bölgeyle kesişip kesişmediğini, yani bir dosyayla eşlenip eşlenmediğini kontrol ederse ne olur? – einpoklum