İlk N
(genellikle bir) bağımsız değişkeni tüketen işlevler için geçersiz kılmaları sağlamanız gerekir.
void foo() {
// end condition argument pack is empty
}
template <class First, class... Rest>
void foo(First first, Rest... rest) {
// Do something with first
cout << first << endl;
foo(rest...); // Unpack the arguments for further treatment
}
Variadic parametresini paketinden çıkardığınızda, bir sonraki aşırı yükü bulur.
Örnek: Rest
o foo()
çağırır açma bu durumda hiçbir üye içerene kadar (böyle devam
foo(true, Rest = { 'a', "hello"}); // First = bool
Ve:
foo(42, true, 'a', "hello");
// Calls foo with First = int, and Rest = { bool, char, char* }
// foo(42, Rest = {true, 'a', "hello"}); // not the real syntax
Ardından sonraki düzeyinden önceki Rest
genişletmek ve almak argüman olmadan aşırı yük). farklı
tamamını argüman bir std::tuple
template <class... Pack>
void store_pack(Pack... p) {
std::tuple<Pack...> store(p...);
// do something with store
}
kullanabilirsiniz paketi saklamak istiyorsanız eğer paketini saklama
Ancak bu daha az yararlı görünmektedir.
paketinde tüm değerler böyle saklayabilir aynı tip ise o
homojen olmadığını paketini saklama:
vector<int> reverse(int i) {
vector<int> ret;
ret.push_back(i);
return ret;
}
template <class... R>
vector<int> reverse(int i, R... r) {
vector<int> ret = reverse(r...);
ret.push_back(i);
return ret;
}
int main() {
auto v = reverse(1, 2, 3, 4);
for_each(v.cbegin(), v.cend(),
[](int i) {
std::cout << i << std::endl;
}
);
}
Ancak bu da az kullanışlı görünüyor. Eğer dizide argümanları saklamak gerekiyorsa aşağıdaki gibi
Önceki sorunuzda neyi özlediniz? (http://stackoverflow.com/questions/3634379/variadic-templates) Ve neden sorularınızın cevaplarını kabul etmiyorsunuz? – ereOn
http://stackoverflow.com/questions/3634379/variadic-templates/3645307#3645307 – kennytm
Yanıt, bağlantılı konuya (Motti, no upvotes?) Olmalıdır. – visitor