我想定义一个通用函数来打印std::map
类似类型的内容。我最初的尝试是这样的功能:
template <class K, class V>
inline void PrintCollection(const std::map<K,V>& map,
const char* separator="\n",
const char* arrow="->",
const char* optcstr="") {
typedef typename std::map<K,V>::const_iterator iter_type;
std::cout << optcstr;
for (iter_type begin = map.begin(), it = begin, end = map.end();
it != end; ++it) {
if (it != begin) {
std::cout << separator;
}
std::cout << it->first << arrow << it->second;
}
std::cout << std::endl;
}
效果很好。当我尝试将这个函数再推广一步,即让它适用于std::multimap
类型时,编译器会生气。我尝试了几种方法std::map
在函数定义中进行泛型,例如:
template <class M, class K, class V>
inline void PrintCollection(const M<K,V>& map,
const char* separator="\n",
const char* arrow="->",
const char* optcstr="") {
typedef typename M<K,V>::const_iterator iter_type;
std::cout << optcstr;
for (iter_type begin = map.begin(), it = begin, end = map.end();
it != end; ++it) {
if (it != begin) {
std::cout << separator;
}
std::cout << it->first << arrow << it->second;
}
std::cout << std::endl;
}
没有成功。
我如何概括我上面定义的这个函数?
更清楚地说,我已经为在这个函数之前定义的类向量类定义了一个函数。它像是
template <class T>
inline void PrintCollection(const T& collection,
const char* separator="\n",
const char* optcstr="") {
typedef typename T::const_iterator iter_type;
std::cout << optcstr;
for (iter_type begin = collection.begin(), it = begin, end = collection.end();
it != end;
++it) {
if (it != begin) {
std::cout << separator;
}
std::cout << *it;
}
std::cout << std::endl;
}
所以我想要实现它来使这个功能专门用于类似地图的类。我是 C++ 的新手,所以我不知道这类东西的确切术语。这是否称为“模板专业化”?