gpt4 book ai didi

C++ 泛型插入标准容器?

转载 作者:太空狗 更新时间:2023-10-29 20:36:45 25 4
gpt4 key购买 nike

如果我有以下程序:

#include <vector>
#include <set>

template<class T, class U>
void AddToContainer(T& container, U value)
{
container.push_back(value);
}

int main(char**, int)
{
std::vector<int> v;
AddToContainer(v, 1);

std::set<int> s;
AddToContainer(s, 1);

return 0;
}

如何使添加到容器中成为通用的?由于 std::set 没有 push_back 而只有 insert,这将无法编译。

最佳答案

您可以使用带有虚拟参数的表达式 SFINAE 来检查 push_back() 是否有效:

template <class C, class V>
auto append(C& container, V&& value, int)
-> decltype(container.push_back(std::forward<V>(value)), void())
{
container.push_back(std::forward<V>(value));
}

template <class C, class V>
void append(C& container, V&& value, ...)
{
container.insert(std::forward<V>(value));
}

您的功能将转发到:

template <class C, class V>
void AddToContainer(C& container, V&& value) {
append(container, std::forward<V>(value), 0);
}

如果 push_back() 是一个有效的表达式,第一个重载将是首选,因为 int 更适合 0 >... 如果 push_back() 不是有效表达式,则只有一个可行的重载。


这是否真的是个好主意是另一个问题。

关于C++ 泛型插入标准容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378658/

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