Tutorialspoint.dev

Variadic function templates in C++

Variadic templates are template that take a variable number of arguments. Variadic function templates are functions which can take multiple number of arguments.

Syntax for a variadic function template: :

template(typename arg, typename... args)
return_type function_name(arg var1, args... var2)

Note :, typename arg, typename... args must be
inside angular brackets. 

Below is an example in C++ to show how we can use variadic function template:

// C++ program to demonstrate working of
// Variadic function Template
#include <iostream>
using namespace std;
  
// To handle base case of below recursive
// Variadic function Template
void print()
{
    cout << "I am empty function and "
            "I am called at last. " ;
}
  
// Variadic function Template that takes 
// variable number of arguments and prints
// all of them.
template <typename T, typename... Types>
void print(T var1, Types... var2)
{
    cout << var1 << endl ;
  
    print(var2...) ;
}
  
// Driver code
int main()
{
    print(1, 2, 3.14, "Pass me any "
              "number of arguments"
                  "I will print ");
  
    return 0;
}

Output:

1
2
3.14
Pass me any number of arguments
I will print

I am empty function and I am called at last.

Remember that templates are replaced by actual functions by compiler.



The variadic templates work as follows :
The statement, print(1, 2, 3.14, “Pass me any number of arguments”, “I will print ”); is evaluated in following manner :
Firstly, the compiler resolves the statement into

cout<< 1 <<endl ;
print(2, 3.14, "Pass me any number of arguments", 
      "I will print
");

Now, the compiler finds a print() function which can take those arguments and in result executes the variadic print() funciton again in similar manner :

cout<< 2 <<endl ;
print(3.14, "Pass me any number of arguments", 
      "I will print
");

Again, it is resolved into the following forms :
(*)

cout<< 3.14 <<endl ;
print("Pass me any number of arguments", 
      "I will print
");

(*)

cout<< "Pass me any number of arguments" <<endl ;
print("I will print
");

(*)

cout<< "I will print
" <<endl ;
print();

Now, at this point the compiler searches for a function overload whose match is the empty function i.e. the function which has no argument.

This means that, all functions that have 1 or more arguments are matched to the variadic template and all functions that with no argument are matched to the empty function.

Reference :
http://www.cplusplus.com/articles/EhvU7k9E/

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



This article is attributed to GeeksforGeeks.org

leave a comment

code

0 Comments

load comments

Subscribe to Our Newsletter