【发布时间】:2016-11-29 17:36:11
【问题描述】:
(例如,从 std::list<some_value_type> 获取 std::list)
考虑以下代码:
#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 的重载版本,但如果有一种涵盖所有容器类型的通用方法,我会更喜欢。
【问题讨论】:
标签: c++ c++11 templates typetraits