C++ 在C++;11是否仍然可以从具有指定模板参数的模板类中获取常规模板类?

C++ 在C++;11是否仍然可以从具有指定模板参数的模板类中获取常规模板类?,c++,c++11,templates,typetraits,C++,C++11,Templates,Typetraits,(例如,从std::list获取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 &

(例如,从
std::list
获取
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;
}
#包括
#包括
标准::字符串组合(int-val,标准::字符串str)
{
返回std::to_字符串(val)+str;
}
模板
自动foo(常量T和容器、常量U和val)
->标准::列表
{
使用RetType=std::list;
复述结果;
用于(自动项目:容器){
结果:推回(合并(项目,val));
}
返回结果;
}
int main()
{
std::列表编号={1,2,3,4,5};
std::list result=foo(数字,std::string(“土豆”);
返回0;
}
这可以编译,但我希望它的工作方式有所不同。我希望
foo
返回传递到其第一个参数中的相同类型的容器,但其值类型更改为第二个参数的值类型,即type
U

因此,如果将
foo
作为第一个参数传入
std::list
,并将
std::string
作为第二个参数传入,则返回
std::list
。或者,如果将
foo
作为第一个参数传入
std::vector
,并将
std::string
作为第二个参数传入,则返回
std::vector
。等等

基本上,我想用实现上述功能的东西来替换
std::list
的两个实例,可能使用
的工具

在C++11中有这样做的方法吗?我找到的唯一解决方案是为我想要使用的每种容器类型创建重载版本的
foo
,但我更希望有一种覆盖所有容器类型的通用方法。

是的,您可以使用模板参数,并将
列表
的每次出现都更改为通用的
C

是的,您可以使用模板参数并将每次出现的
list
更改为通用
C


这不支持自定义分配器(或
集合
/
无序集合
的哈希器/比较器等),我不知道在指定模板类时可以使用省略号。谢谢@T.C.你是对的,但就我而言,这已经足够了。如果我确实需要使用自定义分配器、比较器或散列器,我可以使用类似
template auto-foo(const C&container,const U&val)->C的方法重载
foo
。它需要可以采用任何一种类型的分配器/比较器,但我认为它可以正常工作。@GuyGizmo“可以采用任何一种类型的分配器”不存在;您必须重新绑定它们。@T.C.您是对的。我现在正在深入研究分配器,我意识到我所说的是胡说八道。这不支持自定义分配器(或哈希器/比较器等。对于
set
/
unordered\u set
),我不知道在指定模板类时可以使用省略号。谢谢@T.C.你是对的,但就我而言,这已经足够了。如果我确实需要使用自定义分配器、比较器或散列器,我可以使用类似
template auto-foo(const C&container,const U&val)->C的方法重载
foo
。它需要可以采用任何一种类型的分配器/比较器,但我认为它可以正常工作。@GuyGizmo“可以采用任何一种类型的分配器”不存在;您必须重新绑定它们。@T.C.您是对的。我现在正在深入研究分配器,我意识到我所说的都是胡说八道。
template <template<class...>class C, class T, class U>
auto 
foo(const C<T> &container, const U &val) -> C<U>
{
  using RetType = C<T>;
  // ...
}
transform(numbers.begin(), numbers.end(), inserter(result, result.begin()), [] (int n) {
  return combine(n, " potato");
});