1

我有一个函数,其中“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() 只是删除了顶部元素。我现在编辑了代码片段以反映这些更改。但是它仍然无法正常工作。

4

1 回答 1

2

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

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

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

换句话说,由于 STLstackqueue容器适配器接受两个类型参数(即使第二个具有默认参数值),如果您希望将它们推导出为函数 templatefoo()的模板模板参数,则模板模板参数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(),但这似乎不是您的情况。

于 2013-01-27T20:34:43.800 回答