Biri bana bir dizinin boyutunu veren bu şablon kodu açıklayabilir misiniz?
template<typename T, size_t n>
size_t array_size(const T (&)[n])
{
return n;
}
Anlamadığım kısım bu şablon işlevi için parametre. n
verir oradan dizideki öğelerin sayısı olarak geçtiğimde bu dizi ile ne olur?
CEVAP
Öncelikle bir dizi dışında bir değer almak için çalışıyorum, ilk öğe için bir işaretçi verebilir anlamak için:
int a[] = {1, 2, 3};
int *ap = a; // a pointer, size is lost
int (&ar)[3] = a; // a reference to the array, size is not lost
Başvuru nesneleri tam olarak yazın ya da temel sınıf türü kullanarak bakın. Anahtarı şablonu başvuru diziler alır. Parametre olarak diziler (atıflar) C Yok . Eğer parametre bir dizi türünü verirseniz, bunun yerine bir işaretçi olacak. Yani bir referans kullanarak geçti dizinin boyutunu öğrenmek istediğimiz zaman gereklidir. Boyutu ve öğe türü otomatik olarak çıkarılabilir, genellikle işlev şablonları için olduğu gibi. Aşağıdaki şablonu
template<typename T, size_t n>
size_t array_size(const T (&)[n]) {
return n;
}
Önceden tanımlanmış bir dizi ile çağırdı a
örtülü olarak aşağıdaki işlevi başlatılamadı
size_t array_size(const int (&)[3]) {
return 3;
}
Bu gibi kullanılabilir:
size_t size_of_a = array_size(a);
Bir süre önce yapılan bir değişiklik var[Edit: birileri aynı fikri 25**] ortaya çıktıderleme zamanında bir değer belirleyebilirsiniz. Doğrudan değer yerine, şablon, dönüş türü n
bağlı olarak verir:
template<typename T, size_t n>
char (& array_size(const T (&)[n]) )[n];
Eğer dizi n
eleman varsa, dönüş türü bir dizi boyutu n
öğe türü char
olması için bir referans olduğunu söylüyorsun. Şimdi, derleme zamanı geçti dizinin boyutu belirlendi:
size_t size_of_a = sizeof(array_size(a));
char
bir dizi n
sahip olduğu öğeleri belirli bir dizi çok öğe sayısı verecek n
, boyutu vardır. Derleme zamanında, bunu yapabilirsiniz
int havingSameSize[sizeof(array_size(a))];
Bu işlev, aslında hiçbir zaman olarak adlandırılır, çünkü vücut yok yani tanımlanmış olması gerekmez. Biraz konu açarım umarım.
Biri bana bu SQL enjeksiyon saldırısı ...
Biri açık, basit bir dille bana collec...
Biri bana açıklayabilir kaynak python ...
Basit bir dille biri bana ziyaretçi de...
Birisi TV izleme kullanmak için doğru ...