有什么办法可以让这样的东西工作:
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/