#include <iostream>
#include<map>
#include<string>
#include<vector>
struct ICON{};
template <typename T, typename... ARGS>
void foo(T first, ARGS&&... args) // #1
{
std::cout<<"primary version selected"<<std::endl;
}
template<typename... ARGS>
void foo(ICON*, ARGS&&...args)// #2
{
std::cout<<"overloaded version used"<<std::endl;
}
int main()
{
foo(1,2, "some string literal"); //calls primary
ICON i{};
ICON *ptrI = &i;
foo(ptrI); //calls overloaded version
return 0;
}