The*_*ake 6 c++ containers templates std
问候.
我不太清楚如何解释自己,但我相信一段代码会让你理解我想要做的事情:
template<class A, class B>
void myFunction(A<B>& list)
{
typename A<B>::iterator current = list.begin();
typename A<B>::iterator end = list.end();
while (current != end)
{
current++;
}
}
Run Code Online (Sandbox Code Playgroud)
其中A是STL容器(vector,list ...).它就像开始一样,但有模板:模板,模板内等......
问题是:当你的模板的一个参数本身就是一个模板时,你会怎么做......并且仍然希望支持这个模板支持的每个类型.
这当然不能编译(它说"A不是模板").
有人知道如何创建这样的模板吗?
您正在寻找模板模板参数
template<template<class T, class All = std::allocator<T> > class A, class B>
void myFunction(A<B>& list)
{
typename A<B>::iterator current = list.begin();
typename A<B>::iterator end = list.end();
while (current != end)
{
current++;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在您的特定情况下,我认为通过传递实例化容器会更好,也就是说,
template<class C>
void myFunction(C& list)
{
...
}
Run Code Online (Sandbox Code Playgroud)
像这样用
vector<char> v;
myFunction(v);
Run Code Online (Sandbox Code Playgroud)
您的原始代码必须像这样调用:
myFunction<std::vector, char> (v)
Run Code Online (Sandbox Code Playgroud)
这更加冗长,没有特别的好处
A并且B将是具体类型(而不是模板),因此A<B>没有意义。
您可以这样编写代码:
template<class List>
void myFunction(List &list)
{
typename List::iterator current = list.begin();
typename List::iterator end = list.end();
while (current != end)
{
current++;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要知道该列表中某个元素的类型,列表内有一个 typedef :
typename List::value_type
Run Code Online (Sandbox Code Playgroud)