模板化函数取决于容器

时间:2013-01-27 20:18:25

标签: c++ templates

我有一个函数,其中'T'可以是队列或堆栈。 目前我有功能签名:

template <class T>
void foo(T<string> baa){

  //do something
}

在foo中,我想调用T.pop(),但我不能这样做。

然后我写了两个版本的pop,一个用于队列,一个用于堆栈。

string bar(stack<string> & baa){
  string t=baa.top();
  baa.pop();
  return t;
}
string bar(queue<string> & baa){
  string t=baa.front();
  baa.pop();
  return t;
}

然后我尝试这样做,但它不起作用。我该怎么做?

template <class T>
void foo(T<string> baa){
  //do something
  string baz=bar(baa);
}
编辑:我忘了top()只删除顶部元素。我现在编辑了代码片段以反映这些更改。但它仍然无效。

1 个答案:

答案 0 :(得分:2)

如果你真的想做这样的事情,那么语法你需要的是模板模板参数

template<template<typename> class T>
void foo(T<string>& baa)
{
    ...
}

但是,请注意模板模板参数T的模板参数必须与模板模板参数完全匹配,即使这些参数具有默认参数值。

换句话说,由于STL的stackqueue容器适配器接受两个类型参数(即使第二个具有默认参数值),如果您需要它们要推断为功能模板foo()的模板模板参数,模板模板参数T必须采用两个类型参数:

template<template<typename, typename> class T, typename C>
void foo(T<string, C>& baa)
{
    ...
}

但我会指出,您目前的需求似乎并不需要这样的设计。这就足够了:

template<typename T>
string bar(T& baa)
{
    string t = baa.front();
    baa.pop();
    return t;
}

只有当你需要处理非容器类型的bar()的其他功能模板重载时,你才会被迫采用带有模板模板参数的解决方案,但这又是似乎不是你的情况。