12

Bir sınıf içinde variadic şablon işlevine sahip olmak isterim. Değişken şablon argümanları, döngü benzeri bir şekilde işlenmesi gereken karakterlerdir. Bu yüzden bir baz dava (boş liste) ulaşılana kadar baş/kuyruk bölme ile haskell gibi yazmayı düşündüm. Örnek olarak, verilen argüman sayısını (sadece en az bir örnek) saymalıyız.Variadic şablon işlevi: kafa/kuyruk ve boş taban kaplaması uzmanı

prog.cpp:12:35: error: function template partial specialization ‘count<Head, Tail ...>’ is not allowed 
prog.cpp:12:5: error: prototype for ‘int MyClass::count()’ does not match any in class ‘MyClass’ 
prog.cpp:3:16: error: candidate is: template<char ...X> static int MyClass::count() 

Bunu nasıl elde edebilirsiniz: Bu doesn't seem to work Ancak

struct MyClass { 
    template<char ...X> 
    static int count(); 
}; 


template<> 
int MyClass::count<>() { 
    return 0; 
} 
template<char Head, char ...Tail> 
int MyClass::count<Head, Tail...>() { 
    return 1 + count<Tail...>(); 
} 

:

Aşağıdaki kod ile geldi? Kısmi uzmanlaşmanın işlevler için desteklenmediğini biliyorum. Ama baş/kuyruk ve boş taban büyük/küçük harf sürümüne bir değişken şablonun uzmanlaşmasının kısmi uzmanlığı değil, tam uzmanlığı olmadığını düşündüm, ama yanılıyor olabilirim? Bunu bir işlev yerine bir sınıf olarak yazmam gerekiyor mu?

Şablon sözdizimini kullanmadan temel bir durumu uygulayan örnekler (printf) buldum. Ama sanırım, printf çağrısı şablon sözdizimini kullanmıyor ama tip kesinti, printf(tail...) ,boşsa 'u çağırıyor. Diğer tarafta, benim durumumda, temel durumu çağırırken, count<>(), count() ile aynı değildir.

struct MyClass { 
    template<typename... Tail> 
    static int count() { 
     return 0; 
    } 

    template<char Head, char... Tail> 
    static int count() { 
     return 1 + count<Tail...>(); 
    } 
}; 

#include <iostream> 

int main() { 
    std::cout << MyClass::count<'f','o','o'>(); 
} 

Ve burada bir live example geçerli:

+0

durum için, yani sadece var arg bir kayıt düzeni ve kullanım tuplesize oluşturabilir. Belki aklınızdaki başka şeylerle birlikte çalışmak daha kolaydır? – Skeen

+0

@Skeen Bu basit problemin kolayca tartışılabileceği çok minimalist bir örnekti. Elbette, daha karmaşık bir şeye ihtiyacım var. AFAIK, tuple sadece değerlerle değil, türlerle çalışır. – leemes

+1

Tupeler, verileri de saklayabilir ve bana sorarsanız, çalışmak çok daha kolay görünür. – Skeen

cevap

17

Ben bunları uzmanlaşmış ziyade fonksiyon şablonları aşırı normalde daha iyi bir fikir olduğunu söyleyebilirim. Ben de yerleşik operatör sizeof... bu amaçla kullanılabilecek söz ediyorum:

struct MyClass { 
    template<char... Chars> 
    static int count() { 
     return sizeof...(Chars); 
    //   ^^^^^^^^^ 
    } 
}; 
+0

Aman Tanrım, aşırı yüklemeyi tamamen unutmuşum. Teşekkürler! (konu dışı: LWS> ideone?) – leemes

+0

@leemes: Rica ederim, umarım yardımcı olur! –

+0

Tabii ki, büyüklük var, 'say', gelebileceğim en basit örnekti, bu hala temel problemi gösteriyor. – leemes