gpt4 book ai didi

c++ - 取决于容器的模板化函数

转载 作者:行者123 更新时间:2023-11-30 04:21:21 24 4
gpt4 key购买 nike

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

最佳答案

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

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() 的其他函数模板重载 需要处理非容器类型时,您才会被迫采用带有模板模板参数的解决方案,但这似乎又不是你的情况。

关于c++ - 取决于容器的模板化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14551775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com