4

ı bir parametre paketi kullanılarak printf yeniden oluşturun diyelim: derleyici farklı imzalara sahip 2 farklı işlevler oluşturmak istiyorsunuzÖzyinelemeli şablon parametre paketi işlevi her yineleme için özel bir işlev oluşturuyor mu?

printf("%d is the answer to life, the universe, and everything. Pi = %f", 42, 3.14); 

:

void printf(const char* string) 
{ 
    std::cout << string; 
} 

template <typename T, typename... Params> 
void printf(const char* string, T first, Params... p) 
{ 
    while (*string != '\0') 
    { 
     if (*string == '%' && *(string + 1) != '%') 
     { 
       std::cout << first; 
       string += 2; 
       printf(string, p...); 
       return; 
     } 

     std::cout << *string++; 
    } 
} 

aşağıdaki parametrelerle işlevi diyoruz?

printf(const char*, int, Params...); ve

böylece, 10 bağımsız değişken içeren bir işlev çağrısı 10 farklı fonksiyonlara yol açacağı ise printf(const char*, double, Params...); yaratılıyor. Derleyici bunu en iyi şekilde yapar mı?

cevap

4

Ben şu iki şablon örneklerini bu çağrısından sonuçlanması beklenebilir:

printf(const char*, int, double); 

ve

printf(const char*, double); 

Ve, bu printf() için on bir parametre geçirirseniz evet, derleyici olacak şablon işlevinin on örneğini oluşturur. Bu yüzden şablonlar kod bloat oluşturmak için haklı bir üne sahiptir. Eğer varsa

,

printf("Foo %d\n", 10); 

printf("Bar %d\n", 20); 

ben hem şablon örnekleri özdeş olacağı beklenebilir söyler ve bağlantı anda birlikte birleşti. Ama bu küçük bir teselli.

+1

Sadece OP için bir yorum: neden bu şaşırtıcı? Tek tipli bir regalr (parametre olmayan paket) şablonu için (C ); on farklı beton türü ile kullanıldığında, on farklı şablon örneğine neden olacaktır. –