Dizeleri tutan bir kabın (örneğin vector<string>
, set<string>
, list<string>
) bulunduğu ve bir başlangıç yineleyici ve bir son yineleyici verildiğinde, dizeleri işleyen yineleyici aralığı boyunca bir işlevim var.Stl_container_type <string> :: yineleyicisinin templated parametresini kabul et
Şu an işlev şöyle bildirilir:
template< typename ContainerIter>
void ProcessStrings(ContainerIter begin, ContainerIter end);
Şimdi operator*
, önek operator++
uygulamasının örtük arabirimine uygun olan herhangi bir türü ve işlev çağrısında başka hangi çağrıları olursa olsun kabul eder.
Gerçekten yapmak istediğim, giriş miktarını (pseudocode uyarısı) açıkça kısıtlayan aşağıdaki gibi bir tanıma sahip olacaktır:
template< typename Container<string>::iterator>
void ProcessStrings(Container<string>::iterator begin, Container<string>::iterator end);
bu şekilde kullanabilirsiniz:
vector<string> str_vec;
list<string> str_list;
set<SomeOtherClass> so_set;
ProcessStrings(str_vec.begin(), str_vec.end()); // OK
ProcessStrings(str_list.begin(), str_list.end()); //OK
ProcessStrings(so_set.begin(), so_set.end()); // Error
Esasen, yapmaya çalıştığım şey, işlev belirtimini, kabul ettiği işlevin bir kullanıcısı için açık hale getirecek şekilde kısıtlamak ve kodun derlenememesi durumunda, yanlış parametre türlerini kullandıklarını belirten bir ileti almalarıdır. XXX gövdesinde XXX işlevinin bulunamayacağı işlev gövdesindeki bir şey.
Bunu 'std :: string' veya herhangi bir 'std :: basic_string 'türüyle kısıtlamak ister misiniz? –
Ah, birisi aslında _needs_ __concepts__! Ne yazık ki, geçen yaz, C++ standartlaştırma komitesinin ön plana çıkan bir üyesinin tavsiyesi üzerine, aşırıya kaçtılar çünkü C++ 0x'in gelecek olanı, 'x', onaltılı bir basamak haline geldiği noktaya ertelediler. – sbi
Şablonunuzu neyin arayabileceğini kısıtlamak için niçin İHTİYACINIZ VAR? Şablonun bütün noktası, iyi yapılandırılmış algoritmaların yeniden kullanılmasını sağlar. – jmucchiello