SORU
12 Ocak 2009, PAZARTESİ


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
12 Ocak 2009, PAZARTESİ


Ö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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • Pál Zoltán Illés

    Pál Zoltán

    30 NİSAN 2007
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006