模板参数演绎 - boost :: unordered_map

时间:2016-11-11 03:13:57

标签: c++ boost

当我阅读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这样的地图实例? 我没找到任何指南。有人可以帮忙吗?详细的文件/链接是最好的。

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

如果您开始查看第一个头文件,即实际#include的头文件,您将找到此模板的声明,该声明指定模板参数的所有默认值。 (该声明可能不在实际的头文件中,而是在那里的#include d内部头文件中。)

声明首先被编译,并声明默认值,你在这里看到的是实际的模板定义。

初始模板声明已经指定了模板参数的默认值,并且不需要在此模板定义中指定(事实上,如果确实如此,它将是编译错误。)

一个简短的例子:

// Initial declaration

template<typename T=int> class foo;

// Definition

template<typename T> class foo {};

// Usage
foo<> bar;

实际的Boost头文件结构非常复杂,模板的声明和定义分散在不同的文件中,出于各种各样的原因,由实际的头文件{{1}按正确的顺序组装在你的代码中。