模板函数接受类似于 map<X、Y 的任何类型>
Template function accepting any type similar to map<X, Y>
有没有办法使这样的工作:
template<typename T, typename X, typename Y>
void myFunc(T<X,Y> map, X x, Y y) {
map[x] += y;
}
基本上,我希望任何像map<X,Y>
一样的行为都是有效的输入。
这可能吗?
我得到这个错误,但我不知道它是什么意思:
test.cpp:2:17: error: ' T '不是模板
是,使用模板模板模板参数:
template <template <typename, typename> class M, typename K, typename V>
void Foo(M<K, V> & container)
{
// ...
};
注意,这永远不会匹配任何实际的容器,因为它们有更多的模板参数。更好地使用变量:
template <template <typename, typename, typename...> class M, typename K, typename V, typename ...Args>
void Foo(M<K, V, Args...> & container)
{
// ...
};
如果变量不是一个选项,你可以利用一点包装自己:
template <typename Container> void FooImpl(Container &);
template <template <typename, typename> class M,
typename K, typename V>
void Foo(M<K,V> & c) { FooImpl(c); }
template <template <typename, typename, typename> class M,
typename K, typename V, typename A1>
void Foo(M<K,V,A1> & c) { FooImpl(c); }
template <template <typename, typename, typename, typename> class M,
typename K, typename V, typename A1, typename A2>
void Foo(M<K,V,A1,A2> & c) { FooImpl(c); }
// etc.
作为参考,std::unordered_map
接受5个模板参数(键、值、哈希函子、相等谓词、分配器)。Boost的bimap
可能需要更多的时间
可以通过将函数设置为包装器类的静态成员并将其实现设置为私有,以及通过提供单个免费访问器辅助函数来防止滥用最后一个构造。
最简单的方法是只使用T
作为参数类型。
template<typename T, typename X, typename Y>
void myFunc(T map, X x, Y y) {
map[x] += y;
}
注意,这将允许eg。数组为T
s(例如:T = int*, X = int, Y = int
和函数将y
添加到数组map
的第x
元素。
如果你想把它缩小到地图,你必须决定什么是根据你的地图。识别地图的一种可能是检查它们的key_type
和mapped_type
。如:
template<typename T>
void myFunc(T map, typename T::key_type x, typename T::mapped_type y) {
如果你真的想接受任何接受两个类型参数(而不是更多)的东西,你可以使用template-template参数。然而,我认为这是一个过于语法化的区别,除非您计划用多个参数类型实例化template-template形参,否则不应该使用它。
如果不将map约束为T类型,事情就变得简单多了:
template<typename T, typename X, typename Y>
void myFunc(T map, X x, Y y) {
map[x] += y;
}
// ...
map<int, int> myMap;
myFunc(myMap, 5, 7);
std::map实际上有比K和V更多的形参(它还有一个比较器和一个分配器),所以最好不要匹配它的模板实参。上面的代码仍然只能编译具有非const操作符[]的东西,该操作符以X作为键并返回Y作为值,但对于非特定容器(例如Container),它也很灵活。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型