我有一个函数,其中'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()只删除顶部元素。我现在编辑了代码片段以反映这些更改。但它仍然无效。
答案 0 :(得分:2)
如果你真的想做这样的事情,那么语法你需要的是模板模板参数:
template<template<typename> class T>
void foo(T<string>& baa)
{
...
}
但是,请注意模板模板参数T
的模板参数必须与模板模板参数完全匹配,即使这些参数具有默认参数值。
换句话说,由于STL的stack
和queue
容器适配器接受两个类型参数(即使第二个具有默认参数值),如果您需要它们要推断为功能模板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()
的其他功能模板重载时,你才会被迫采用带有模板模板参数的解决方案,但这又是似乎不是你的情况。