gpt4 book ai didi

c++ - 在 C++11 中,是否可以从具有指定模板参数的模板类中获取通用模板类?

转载 作者:行者123 更新时间:2023-11-27 22:48:09 26 4
gpt4 key购买 nike

(例如从 std::list 得到 std::list<some_value_type>)

考虑以下代码:

#include <list>
#include <string>

std::string combine(int val, std::string str)
{
return std::to_string(val) + str;
}

template <class T, class U>
auto foo(const T &container, const U &val)
-> std::list<U>
{
using RetType = std::list<U>;
RetType result;

for(auto item : container) {
result.push_back(combine(item, val));
}

return result;
}

int main()
{
std::list<int> numbers = {1, 2, 3, 4, 5};
std::list<std::string> result = foo(numbers, std::string(" potato"));
return 0;
}

这可以编译,但我希望它以不同的方式工作。我想要 foo返回与传递给它的第一个参数相同类型的容器,但其值类型更改为第二个参数的类型,即类型 U .

所以如果foo传入 std::list<int>作为它的第一个参数和 std::string作为它的第二个参数,它返回 std::list<std::string> .或者,如果 foo传入 std::vector<int>作为它的第一个参数和 std::string作为它的第二个参数,它返回 std:: vector<std::string> .等等。

基本上我想替换 std::list<U> 的两个实例完成上述任务,可能使用 <type_traits> 的设施.

在 C++11 中有没有办法做到这一点?我找到的唯一解决方案是创建 foo 的重载版本对于我想使用的每种容器类型,但如果有一种涵盖所有容器类型的通用方法,我会更喜欢。

最佳答案

是的,您可以使用模板模板参数 并更改每次出现的list<T>。通用 C<T> :

template <template<class...>class C, class T, class U>
auto
foo(const C<T> &container, const U &val) -> C<U>
{
using RetType = C<T>;
// ...
}

一种常用的替代方法是使用迭代器,迭代器是容器元素的通用接口(interface)。可以使用的标准算法是std::transform :

transform(numbers.begin(), numbers.end(), inserter(result, result.begin()), [] (int n) {
return combine(n, " potato");
});

关于c++ - 在 C++11 中,是否可以从具有指定模板参数的模板类中获取通用模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40872206/

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