包含标准集合迭代器的模板
A template that contains std collection iterators
此模板能够存储特定类型的向量迭代器。
template<typename T>
struct foo
{
typedef typename std::vector<T>::iterator it;
std::vector<it> m_collection;
};
如何使模板更通用并支持其他标准集合迭代器(std::list
、std::deque
等)?
How can template be made more generic and support other std collection iterators (list, deque etc)?
是否要将容器作为模板参数传递?
即:您在寻找模板-模板参数吗?
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
不兼容,后者需要非模板参数。
或者您可能想通过专业化传递类型和 select 容器以及包含的类型?
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;
};
没有推导容器和包含的类型?
这是一个最小的 运行 示例,其中 foo
可以在序列容器之间切换以存储 it
:
#include <vector>
#include <deque>
#include <list>
template
<
typename T,
template<typename, typename> class SequenceContainer,
template <typename> class Allocator = std::allocator
>
struct foo
{
typedef typename SequenceContainer<T, Allocator<T>>::iterator it;
SequenceContainer<it, Allocator<it>> m_collection;
};
using namespace std;
int main()
{
foo<double, vector> vecFoo;
foo<double, deque> dequeFoo;
foo<double, list> listFoo;
return 0;
};
此模板能够存储特定类型的向量迭代器。
template<typename T>
struct foo
{
typedef typename std::vector<T>::iterator it;
std::vector<it> m_collection;
};
如何使模板更通用并支持其他标准集合迭代器(std::list
、std::deque
等)?
How can template be made more generic and support other std collection iterators (list, deque etc)?
是否要将容器作为模板参数传递?
即:您在寻找模板-模板参数吗?
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
不兼容,后者需要非模板参数。
或者您可能想通过专业化传递类型和 select 容器以及包含的类型?
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;
};
没有推导容器和包含的类型?
这是一个最小的 运行 示例,其中 foo
可以在序列容器之间切换以存储 it
:
#include <vector>
#include <deque>
#include <list>
template
<
typename T,
template<typename, typename> class SequenceContainer,
template <typename> class Allocator = std::allocator
>
struct foo
{
typedef typename SequenceContainer<T, Allocator<T>>::iterator it;
SequenceContainer<it, Allocator<it>> m_collection;
};
using namespace std;
int main()
{
foo<double, vector> vecFoo;
foo<double, deque> dequeFoo;
foo<double, list> listFoo;
return 0;
};