模板方法中的std容器

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不是模板").

有人知道如何创建这样的模板吗?

Arm*_*yan 7

您正在寻找模板模板参数

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)

这更加冗长,没有特别的好处


Cyg*_*sX1 2

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)