如何使模板更通用并支持其他标准集合迭代器(列表、双端队列等)?
您想将容器作为模板参数传递吗?
也就是说:您在寻找模板-模板参数吗?
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;
};
不推导出容器和包含类型?