繁体   English   中英

模板参数推导-boost :: unordered_map

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM