Variadic templates without functional parameters

Can I use variable templates without using template parameters as function parameters?

When I use them, it compiles:

#include <iostream> using namespace std; template<class First> void print(First first) { cout << 1 << endl; } template<class First, class ... Rest> void print(First first, Rest ...rest) { cout << 1 << endl; print<Rest...>(rest...); } int main() { print<int,int,int>(1,2,3); } 

But when I do not use them, it does not compile and does not complain about ambiguity:

 #include <iostream> using namespace std; template<class First> void print() { cout << 1 << endl; } template<class First, class ... Rest> void print() { cout << 1 << endl; print<Rest...>(); } int main() { print<int,int,int>(); } 

Unfortunately, the classes that I want to provide as template parameters are not real (they have static functions that are called inside the template function). Is there any way to do this?

+7
source share
2 answers
 template<class First> // 1 template parameter void print() { cout << 1 << endl; } #if 0 template<class First, class ... Rest> // >=1 template parameters -- ambiguity! void print() { cout << 1 << endl; print<Rest...>(); } #endif template<class First, class Second, class ... Rest> // >=2 template parameters void print() { cout << 1 << endl; print<Second, Rest...>(); } 
+20
source

Make it a type.

 template <typename... Ts> struct print_impl; template <typename T> struct print_impl<T> { static void run() { std::cout << 1 << "\n"; } }; template <typename T, typename... Ts> struct print_impl<T, Ts...> { static void run() { std::cout << 1 << "\n"; print_impl<Ts...>::run(); } }; template <typename... Ts> void print() { print_impl<Ts...>::run(); } int main() { print<int, int, int>(); return 0; } 
+8
source

All Articles