Как правило, C ++ способ написания алгоритмов, выполняющих список, последовательность, ... состоит в предоставлении итераторов в качестве аргументов.
template < class iterator >
doSomething(iterator beg, iterator end);
Это решает, что List
По моему опыту, создание хороших шаблонизированных функций, работающих на итераторах, может быть большой (слишком большой) работой, но это "путь C ++" ...
Если вы идете по этому пути, рассмотрите возможность использования Boost.ConceptCheck . Это сделает вашу жизнь намного проще.