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.
leave a comment
0 Comments