2012-03-23 24 views
5

ile aynı türden parametreler var C++ 11'de sunulan, ancak farklı türlerde olmayan, tür güvenli değişken işlevler kullanmak istiyorum. Bir örnek:tür güvenli parametreleri

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

tüm parametrelerin tipi aynıdır, nedenle böyle bir şey yazmak için belki mümkündür:

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

O mingw g ++ 4,5 bu hata ile derler:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

o {5, 6} tip Point ait olduğunu bilmiyorlar

. Çözüm nedir?

+0

Lütfen s/variable/variadic/ –

+1

Sormak zorundayım, verileriniz 'max_element' gibi bir şeyin uygun olmadığı birden çok toplu olmayan değişkende depolanıyor mu? –

+0

Fonksiyonu uzmanlaştırma, bunun yerine bir yüklem iletme. – Xeo

cevap

10

Değişken şablonları kullanmak için çözüm değil! Fonksiyon şablonları ile kullanıldığında, argüman türlerini çıkarmayı amaçlarlar. Yapmak istediğiniz şey bu değil: argümanların beklenen tipte olmasını istiyorsunuz.

Ben bu konuda pratik deneyim bir sürü yok ama bunun için başlatıcı listelerini kullanmak isterdim:

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

Sen o zaman keyfi tipleri ancak bu kullanamazsınız şikayet olabilir Ne tür bir yer olduğunu söylemek gerektiğini anlamanız gerekir. ... Ve argüman türünü belirtmeniz gerekmesine rağmen bir şablon yapılabilir.