Я думаю, что ваша первая перегрузка printf также должна быть шаблоном, но я не уверен на 100%.
Во всяком случае, это работает более или менее так:
printf("APPLE", 10, '@', 9.0);
// this calls printf(const char*, int, char, double)
// with T=const char*, and ARG={int, char, double}
printf(const char* a, ARG ... C) {
std::cout<<a; // this displays "APPLE"
print_f(C...);
// this calls printf(int, char, double)
// with T=int, and ARG={char, double}
printf(int a, ARG ... C) {
std::cout<<a; // this displays 10
print_f(C...);
// this calls printf(char, double)
// with T=char, and ARG={double}
printf(char a, ARG ... C) {
std::cout<<a; // this displays '@'
print_f(C...);
// this calls printf(double)
// with T=double, and ARG={}
printf(double a, ARG ... C) {
std::cout<<a; // this displays 9.0
print_f(C...);
// this calls printf()
printf() {
}
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<std::endl;
Следует также отметить, что в вашем коде все значения отображаются в одной строке, за которой следует множество пустых строк. Я думаю, что вы хотели endl
до рекурсии.
Согласно вашему редактированию: в вашей гипотетической функции template<typename T, typename ... ARG>
void print_f(const T& a)
вы не сможете вызывать эту функцию, если вы не указали ARG самостоятельно, поскольку ее нельзя определить из типов параметров функции, поскольку ARG больше не присутствует в параметрах.
Кроме того, шаблоны экземпляров не могут быть созданы, поскольку они не являются типом, они представляют собой группу типов. Если вы действительно хотите создать экземпляр чего-либо, вы можете использовать кортеж: std::tuple<ARGS> C;
, но все объекты будут созданы по умолчанию, поскольку вы не передали параметры в функцию для построения.