Problem ze zrozumieniem szablonów ze zmienną ilością parametrów.

0

Próbuję ogarnąć działanie szablonów ze zmienną ilością parametrów, ale mam pewien problem. W ramach przećwiczenia tego, chcę napisać szablon funkcji, który po prostu wyświetli wszystkie swoje parametry, ale raz, że nie pokazuje ostatniego parametru, a dwa przyjmuje on tylko typy liczbowe a chciałbym, aby mógł też pokazać np. stringa. Jak to zrobić? Oto co do tej pory napisałem:

#include<iostream>

using namespace std;

template<typename T>
T f(T v) {
  return v;
}

template<typename T, typename... Args>
T f(T first, Args... args) {
    cout<<first<<" ";
  return f(args...);
}
int main()
{
    f(1, 21, 37.5, 10, 12);
    return 0;
}

3

Co do ostatniego parametru: jak myślisz, która funkcja będzie wywołana dla poniższego?

f(42);

Nie możesz podać innego typu, bo nie wiedzieć czemu chcesz koniecznie zwracać wartość typu pierwszego argumentu funkcji.

3
#include<iostream>
 
template<typename T>
void f(T v) {
    std::cout << v << ' ';
}
 
template<typename T, typename... Args>
void f(T first, Args... args) {
    f(first);
    f(args...);
}

int main()
{
    f(1, 21.1, 37.5, "meksyk", 10, 12);
}
0

@kq: Domyślałem się o co chodzi, tylko nie wiedziałem co zrobić, aby to wszystko chodziło z dowolnym typem danych.
@Mokrowski: Dzięki wielkie za pokazanie tego :) Nie rozumiem jeszcze tylko, czemu trzeba koniecznie podać pierwszy parametr, tzn. czemu nie można pominąć argumentu T first w void f(T first, Args... args).

1

Tak wygląda rekurencja w szablonach. Argument o nieznanej liczbie parametrów, składa się z 1 elementu i reszty. Reszta składa się z 1 elementu i reszty-reszty. Ta składa się z ... i masz rekurencję. Warunkiem stopu jest przypadek gdzie .. nie ma reszty :-)

3

Ja dodam, że w tym przypadku powinno się używać perfect forwarding:
https://wandbox.org/permlink/51dPtBd3iIccJkkP

#include <iostream>
#include <utility>

template<typename T>
void f(T&& v) {
    std::cout << std::forward<T>(v) << ' ';
}
 
template<typename T, typename... Args>
void f(T&& first, Args&&... args) {
    f(std::forward<T>(first));
    f(std::forward<Args>(args)...);
}
 
int main()
{
    f(1, 21.1, 37.5, "meksyk", 10, 12);
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1