首页 > 解决方案 > 嵌套模板函数采用 2 个具有相同内部类型的容器

问题描述

我正在尝试编写函数,该函数大致类似于采用两个容器实例的函数(假设现在它们是相同的),包含相同的类型并合并它们。所以这是我的向量函数:

template<typename T>
void test(std::vector<T> v1, std::vector<T> v2) {
  std::cout << "called nested for c\n";
}

它有效。

现在我想要一个适用于集合或向量的。我试试这个:

template<typename T, template <typename> typename C >
void test(C<T> v1, C<T> v2) {
  std::cout << "called nested for c<t>\n";
}

并得到

nestedt.cc:33:6:注意:模板参数推导/替换失败:nestedt.cc:43:12:错误:模板参数数量错误(3,应为 1)测试(s,s);^ nestedt.cc:32:51: 注意:为“模板类 C”提供模板类型名 C > ^

我试试

template< template <typename T> typename C >
void test(C<T> v1, C<T> v2) {}

std::set<int> s = {1,2};
test(s, s);

这不起作用:

nestedt.cc:32:6:注意:模板参数推导/替换失败:nestedt.cc:42:12:注意:无法将“s”(类型“std::set”)转换为类型“int”测试(s, s); ^

所以我尝试

template<typename C, typename T >
void test(C<T> v1, C<T> v2) {}

并得到

nestedt.cc:32:6: 注意: 候选: 模板 void test(C, C) void test(C v1, C v2) { ^ nestedt.cc:32:6: 注意:模板参数推导/替换失败:nestedt。 cc:42:12:注意:无法推断模板参数 'T' test(s, s); ^

我觉得我什至还没有完全理解模板在 C++ 中的实际工作方式,这很可悲。同样在现实中,我希望容器有所不同。理想情况下,能够以某种方式指定一组有限的允许容器。它们并不是真正的 std:: 容器。

请注意,最终目标是能够采用 2 个不同的容器,例如test(vector<int>, set<int>). 并且修改容器是不可能的。

标签: c++templates

解决方案


我相信你正在寻找的是

template<template <typename...> typename Cont1, 
         template <typename...> typename Cont2,
         typename... T>
void test(Cont1<T...> a, Cont2<T...> b) { }

在上面template <typename...> typename Cont1声明了一种模板模板类型并template <typename...> typename Cont2声明了另一种,因此您可以拥有两种不同的容器类型。两者共享T...,因此每个模板容器都需要有一个匹配的模板参数列表。这表示

test(std::map<int, int>{}, std::map<int, int>{});
test(std::set<int>{}, std::set<int>{});
test(std::vector<int>{}, std::set<int>{});

所有的工作,但

test(std::map<int, int>{}, std::vector<int>{});
test(std::map<int, int>{}, std::set<int>{});

不会。


推荐阅读