c++ - 接受类似于 map<X, Y> 的任何类型的模板函数

标签 c++ templates

有什么办法可以让这样的东西工作:

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’ is not a template

最佳答案

是的,使用模板模板参数:

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 采用五个模板参数(键、值、散列仿函数、相等谓词、分配器)。 Boost 的 bimap 可能需要更多。

可以通过使函数成为包装类的静态成员并将实现设为私有(private),以及通过提供一个免费的访问辅助函数来防止滥用最后一个构造。

关于c++ - 接受类似于 map<X, Y> 的任何类型的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8031605/

相关文章:

c++ - 检查一个整数是否是 O(1) 空间中的回文(错误答案)

c++ - 隐藏私有(private)重载虚函数?

c++ - 命名空间导致模板重载解析不理想

c++ - 依赖于构造函数的类模板参数

validation - 在CloudFormation模板中设置所需的参数输入

c++ - 将不同类型的QList转换为QString的静态函数

c++ - 程序运行到一半就停止了?

c++ - constexpr new 如何分配内存?

c# - 从模板生成 PDF 的最佳方式

c++ - 派生到基隐式指针类型转换