The trick is to name the template template arguments:
#include <vector>
#include <iostream>
#include <typeinfo>
template <
typename T ,
typename A,
template <typename = T, typename = A> class Container_t
>
void MyFunc(Container_t<T, A> &data) {
std::cout << "value type = " << typeid(T).name() << std::endl;
std::cout << "allocator type = " << typeid(A).name() << std::endl;
std::cout << "container type = " << typeid(Container_t<T,A>).name() << std::endl;
}
template <typename T>
void MyFunc2( T v ) { }
int main()
{
std::vector<char> v;
MyFunc<char, std::allocator<char>, std::vector>(v);
MyFunc(v);
}
If you do not need anything except the value type and the container ...
#include <vector>
#include <map>
#include <iostream>
#include <typeinfo>
template <
typename T ,
typename...Rest,
template <typename, typename...> class Container_t
>
void MyFunc(Container_t<T, Rest...> &data) {
std::cout << "value type = " << typeid(T).name() << std::endl;
std::cout << "container type = " << typeid(Container_t<T,Rest...>).name() << std::endl;
}
template <typename T>
void MyFunc2( T v ) { }
int main()
{
std::vector<char> v;
std::map<char, int> m;
MyFunc(v);
MyFunc(m);
}
source
share