c++ - 嵌套模板函数采用 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>)
. 并且修改容器是不可能的。
解决方案
我相信你正在寻找的是
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>{});
不会。
推荐阅读
- jquery - 将属性转换回数组
- mysql - 根据行本身选择结果
- .net-core - “Access-Control-Allow-Origin”标头包含多个值,但只允许一个
- c - if (y & (y = 2) 那么如何处理这个 if 条件
- ffmpeg - Win10下的FFMPEG H.264编码与多款AMD RX580卡
- jboss-eap-7 - 无法在 Jboss EAP 7.1 服务器中添加驱动程序
- python - 如何从 Python 中的 Json 数组中检索特定记录?
- react-native - 单击onPress按钮后如何更改按钮上的图标(图标名称属性)
- javascript - 使用 ErrorBoundary 捕获后 React 仍然显示错误
- python-2.7 - 使用 Scapy 时未解决的参考 IP() 和 TCP()