模板化函数取决于容器
Templated Functions Depending on Container
我有一个函数,其中"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 的 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()
时,才会强制采用具有模板模板参数的解决方案,但情况似乎并非如此。
相关文章:
- 重载运算符new[]的行为取决于析构函数
- 我想要一个具有子函数的函数访问相同的命名函数,而不使用它取决于其子类的类
- 编译时函数的选择取决于类型大小
- 初始化数据成员取决于构造函数中的条件
- 执行特定函数取决于类型
- 模板函数,其中模板参数类型取决于函数参数
- 保证复制责任的行为是否取决于用户定义的复制构造函数的存在
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 模板层次结构中的可选虚拟函数,具体取决于参数
- 委托构造函数和默认参数,具体取决于其他参数
- 如何将函数指针声明指向模板函数,其返回类型取决于模板类
- 如何声明包装器类型 X 的移动构造函数<T> noexcept 取决于is_nothrow_move_constructible<T>?
- C++调用具有不同签名的函数,具体取决于类型
- 模板化结构的友元函数,其参数类型取决于结构的内部
- 没有调用C++析构函数,具体取决于链接顺序
- 条件跳转或移动取决于函数调用中未初始化的值
- 变量模板函数,其中返回类型取决于模板参数列表
- Pimpl 习语实现取决于模板函数
- 如果函数类型仅依赖于其自己的模板参数,则取决于函数类型
- 取决于C++函数的 QML 强制绑定更新