[英]template argument deduction - boost::unordered_map
当我阅读boost :: unordered_map源代码时,我对类的定义感到困惑,如下所示:
template <class K, class T, class H, class P, class A>
class unordered_map
{
public:
typedef K key_type;
typedef std::pair<const K, T> value_type;
typedef T mapped_type;
typedef H hasher;
typedef P key_equal;
typedef A allocator_type;
private:
typedef boost::unordered::detail::map<A, K, T, H, P> types;
typedef typename types::traits allocator_traits;
typedef typename types::table table;
...
private:
table table_;
public:
// constructors
explicit unordered_map(
size_type = boost::unordered::detail::default_bucket_count,
const hasher& = hasher(),
const key_equal& = key_equal(),
const allocator_type& = allocator_type());
...
};
H类,P类和A类没有默认值,那么为什么用户可以声明诸如boost::unordered_map<Key, Value> map
这样的映射实例? 我没有找到任何指南。 有人可以帮忙吗? 最好是详细的文档/链接。
<boost/unordered/unordered_map.hpp>
包括<boost/unordered/unordered_map_fwd.hpp>
,其中包含以下声明:
template <class K,
class T,
class H = boost::hash<K>,
class P = std::equal_to<K>,
class A = std::allocator<std::pair<const K, T> > >
class unordered_map;
如果开始查看第一个头文件(实际上是#include
头文件),则将查找此模板的声明,该声明指定模板参数的所有默认值。 (该声明可能不在实际的头文件中,而是在从其中#include
d的内部头文件中)。
该声明首先被编译,并声明默认值,在这里您将看到实际的模板定义。
初始模板声明已经指定了模板参数的默认值,并且不需要在此模板定义中指定(实际上,如果这样做,将是编译错误)。
一个简单的例子:
// Initial declaration
template<typename T=int> class foo;
// Definition
template<typename T> class foo {};
// Usage
foo<> bar;
实际的Boost头文件的结构非常复杂,由于各种原因,模板的声明和定义分散在不同的文件中,这些原因由您#include
代码中的实际头文件以正确的顺序进行了组装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.