#include <iostream>
#include <type_traits>
#include <vector>
#include <string>
#include <functional>
#include <map>
#include <algorithm>
#include <sstream>
#include <set>
#include <unordered_map>
using namespace std;
template<typename... T>
void f(T...)
{
std::cout << "variadic version called" << std::endl;
}
//overload for 2 args
template<typename T, typename V>
void f(T, V)
{
std::cout << "2 version called" << std::endl;
}
//overload for 3 args
template<typename T, typename V, typename U>
void f(T, V,U)
{
std::cout << "3 version called" << std::endl;
}
int main()
{
f(3,3,4,5); //calls #1
f(2,4.4); //calls #2
f(33,6,4); //calls #3
}