C++ 为嵌套容器生成模板函数

C++ 为嵌套容器生成模板函数,c++,templates,c++11,C++,Templates,C++11,我试图创建一个通用的测试函数,它接受一个容器,比如list、set或vector,并返回嵌套的容器:list of list、set of set、vector of vector。非泛型函数如下所示: vector<vector<string>> test(vector<string>& in_container) { vector<vector<string>> out_continer; // out_c

我试图创建一个通用的测试函数,它接受一个容器,比如list、set或vector,并返回嵌套的容器:list of list、set of set、vector of vector。非泛型函数如下所示:

vector<vector<string>> test(vector<string>& in_container)
{
    vector<vector<string>> out_continer;

    // out_continer will be filed using values from in_container

    return out_continer;
}

list<list<int>> test(list<int>& in_container)
{
    list<list<int>> out_continer;

    // out_continer will be filed using values from in_container

    return out_continer;
}

set<set<float>> test(set<float>& in_container)
{
    set<set<float>> out_continer;

    // out_continer will be filed using values from in_container

    return out_continer;
}
向量测试(向量和容器中)
{
矢量输出控制器;
//out\u continer将使用in\u容器中的值进行归档
返回容器;
}
列表测试(列表和容器中)
{
列出内容;
//out\u continer将使用in\u容器中的值进行归档
返回容器;
}
设置测试(在容器中设置(&U)
{
放线;
//out\u continer将使用in\u容器中的值进行归档
返回容器;
}

但我不知道如何制作一个模板测试函数,它将等同于这些单独的测试示例

vector
list
(和
deque
)具有相同的模板参数集,是普通序列,因此您可以使用

template <typename T, typename U, template <typename, typename> class C>  
C<C<T, U>, std::allocator<C<T, U>>> test(C<T, U> &in)
{
  C<C<T, U>, std::allocator<C<T, U>>> out;
  // Fill it here
  return out;
}

int main() 
{
  std::vector<int> v;
  std::vector<std::vector<int>> vv = test(v);

  std::list<int> l;
  std::list<std::list<int>> ll = test(l);
}
模板
C测试(C&in)
{
C out;
//在这里填
返回;
}
int main()
{
std::向量v;
标准::矢量vv=试验(v);
std::列表l;
标准::列表ll=测试(l);
}
(代码有点复杂,因为我们必须显式地指定外部容器的分配器类型,但它可能会得到改进。)


同时,
set
是一种不同类型的容器(关联),可能无论如何都需要一个专用的函数。

vector
list
(和
deque
)具有相同的模板参数集,是普通序列,因此您可以使用

template <typename T, typename U, template <typename, typename> class C>  
C<C<T, U>, std::allocator<C<T, U>>> test(C<T, U> &in)
{
  C<C<T, U>, std::allocator<C<T, U>>> out;
  // Fill it here
  return out;
}

int main() 
{
  std::vector<int> v;
  std::vector<std::vector<int>> vv = test(v);

  std::list<int> l;
  std::list<std::list<int>> ll = test(l);
}
模板
C测试(C&in)
{
C out;
//在这里填
返回;
}
int main()
{
std::向量v;
标准::矢量vv=试验(v);
std::列表l;
标准::列表ll=测试(l);
}
(代码有点复杂,因为我们必须显式地指定外部容器的分配器类型,但它可能会得到改进。)


同时,
set
是一种不同类型的容器(关联),可能无论如何都需要一个专用的函数。

我认为您不能自动执行此操作,但如果指定类型,您可以设置一个模板函数:

template <typename T>
T test(typename T::value_type& in_container)
{
    T out_container;
    return out_container;
}

int main()
{
    vector<string> v;
    v.push_back("hello");
    auto w = test<vector<vector<string>>>(v); // w is a vector<vector<string>> now
}
模板
T测试(typename T::value\u type和in\u容器)
{
取出集装箱;
返回容器;
}
int main()
{
向量v;
v、 推回(“你好”);
自动w=test(v);//w现在是一个向量
}

我认为您不能自动执行此操作,但如果指定类型,您可以设置模板功能:

template <typename T>
T test(typename T::value_type& in_container)
{
    T out_container;
    return out_container;
}

int main()
{
    vector<string> v;
    v.push_back("hello");
    auto w = test<vector<vector<string>>>(v); // w is a vector<vector<string>> now
}
模板
T测试(typename T::value\u type和in\u容器)
{
取出集装箱;
返回容器;
}
int main()
{
向量v;
v、 推回(“你好”);
自动w=test(v);//w现在是一个向量
}

谢谢。你能解释一下这个“模板”吗。这里发生了什么?我知道普通的模板,但对我来说,这看起来像是某种黑暗魔法。@ BATCHTEST:C++中的模板有三种参数:类型参数(如我们熟悉的<代码>类型名>代码>)、非类型参数(如<代码> int n>代码>)和模板参数(AKA模板模板PARAMATER)。我的模板中的最后一个参数正是第三类参数:模板参数
C
声明为
template class C
。此类参数不经常使用(最好避免使用)。你可以在这里读到:谢谢。你能解释一下这个“模板”吗。这里发生了什么?我知道普通的模板,但对我来说,这看起来像是某种黑暗魔法。@ BATCHTEST:C++中的模板有三种参数:类型参数(如我们熟悉的<代码>类型名>代码>)、非类型参数(如<代码> int n>代码>)和模板参数(AKA模板模板PARAMATER)。我的模板中的最后一个参数正是第三类参数:模板参数
C
声明为
template class C
。此类参数不经常使用(最好避免使用)。您可以在此处阅读: