template<class> struct Printer;
// I want this to match std::vector (and similar linear containers)
template<template<class, class...> class T, class TV, class... TS>
struct Printer<T<TV, TS...>> { ... };
// I want this to match std::map (and similar map-like containers)
template<template<class, class, class...> class TM, class TK, class TV, typename... TS>
struct Printer<TM<TK, TV, TS...>> { ... }
int main()
{
// Both of these match the second specialization, which is only intended
// for std::map (and similar map-like containers)
Printer<std::vector<int>>::something();
Printer<std::map<int, float>>::something();
}
Как видно из примера, std::vector
и std::map
соответствуют второй специализации. Я думаю, это потому, что параметр std::vector
allocator сопоставляется с TV
, который предназначен для значения std::map
.
Как я могу сопоставить std::vector
(и другие линейные контейнеры) с первой специализацией и std::map
(и другими контейнерами с ключом) со вторым?