模板化函数取决于容器

Templated Functions Depending on Container

本文关键字:取决于 函数      更新时间:2023-10-16

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

template <class T>
void foo(T<string> baa){
  //do something
}

在foo中,我想调用T.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);
}

编辑:I忘记了 top() 只是删除了 top 元素。现在,我已经编辑了代码片段以反映这些更改。但是它仍然不起作用。

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

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()时,才会强制采用具有模板模板参数的解决方案,但情况似乎并非如此。