Вы также можете использовать функторы. С их помощью вы можете частично специализировать то, что вы хотите
#include<iostream>
#include<vector>
#include <list>
template<template<class, class> class C, class T, class A>
struct handle {
void operator()(C<T, A> const &c) {
std::cout << "General handling\n";
}
};
template<class T, class A>
struct handle<std::vector, T, A>{
void operator()(std::vector<T, A> const& c)
{
std::cout << "vector handling\n";
}
};
//To test
int main(){
std::list<int, std::allocator<int>> ls(10,0);
handle<std::list, int, std::allocator<int>>{} (ls);
std::vector<int, std::allocator<int>> vec(10,0);
handle<std::vector, int, std::allocator<int>>{} (vec);
}