模板函数接受类似于 map<X、Y 的任何类型>

Template function accepting any type similar to map<X, Y>

本文关键字:gt 类型 任何 lt 函数 map 类似于      更新时间:2023-10-16

有没有办法使这样的工作:

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_typemapped_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),它也很灵活。