Как сделать шаблон более универсальным и поддерживать другие итераторы коллекции std (list, deque и т. Д.)?
Вы хотите передать контейнеры в качестве аргументов шаблона?
То есть: вы ищете аргументы шаблона-шаблона?
template <template <typename...> class C, typename T>
struct foo
{
typedef typename C<T>::iterator it;
std::vector<it> m_collection;
};
Можно использовать следующим образом
foo<std::vector, int> fvi;
foo<std::set, long> fsl;
Или, может быть
template <template <typename...> class C, typename ... Ts>
struct foo
{
typedef typename C<Ts...>::iterator it;
std::vector<it> m_collection;
};
То есть вы можете использовать его и для карт?
foo<std::map, int, std::string> fmis;
foo<std::unordered_map, long, char> fulc;
К сожалению, это решение несовместимо с std::array
, для которого требуется аргумент без шаблона.
Или, может быть, вы хотите передать тип и выбрать контейнер и содержащий его тип, как при специализации?
template <typename>
struct foo;
template <template <typename...> class C, typename ... Ts>
struct foo<C<Ts...>>
{
typedef typename C<Ts...>::iterator it;
std::vector<it> m_collection;
};
Так что вы можете использовать его следующим образом
foo<std::vector<int>> fvi;
foo<std::set<long>> fsl;
foo<std::map<int, std::string>> fmis;
foo<std::unordered_map<long, char>> fulc;
, а также добавить специализацию для std::array
template <template <typename, std::size_t> class A,
typename T, std::size_t N>
struct foo<A<T, N>>
{
typedef typename A<T, N>::iterator it;
std::vector<it> m_collection;
};
Или, может быть, просто
template <typename T>
struct foo
{
typedef typename T::iterator it;
std::vector<it> m_collection;
};
без выведения контейнера и содержимого типа?