当前位置:  开发笔记 > 编程语言 > 正文

为向量定义哈希:模板参数在部分特化中不可推导

如何解决《为向量定义哈希:模板参数在部分特化中不可推导》经验,为你挑选了1个好方法。

我正在尝试为矢量定义一个哈希.我有一个简单类型的主要模板,以及具有的类的专门化operator().但是,我收到一个错误template parameters not deducible in partial specialization.有人可以指出为什么?

 template  struct hash>
  {
    size_t operator()(const vector &x) const
    {
        size_t res = 0;

        for(const auto &v:x) {
            boost::hash_combine(res,v);
        }

        return res;
    }
  };

  template  struct hash()()))>::value, T>>>
  {
    size_t operator()(const vector &x) const
    {
        size_t res = 0;

        for(const auto &v:x) {
            boost::hash_combine(res,v());
        }

        return res;
    }
  };

T.C... 6

我不喜欢这里的部分特化,特别是因为它会导致代码重复.

template  
struct hash>
{
    template
    static auto call_if_possible(const T& t, int) -> decltype(t()) { return t(); }
    template
    static auto call_if_possible(const T& t, ...) -> decltype(t) { return t; }

    size_t operator()(const vector &x) const
    {
        size_t res = 0;
        for(const auto &v:x) {
            boost::hash_combine(res,call_if_possible(v, 0));
        }
        return res;
    }
};

(如果这hash是实际的std::hash,则答案是"不要这样做".除非专门化取决于用户定义的类型,否则您可能不会专门化标准库模板.)



1> T.C...:

我不喜欢这里的部分特化,特别是因为它会导致代码重复.

template  
struct hash>
{
    template
    static auto call_if_possible(const T& t, int) -> decltype(t()) { return t(); }
    template
    static auto call_if_possible(const T& t, ...) -> decltype(t) { return t; }

    size_t operator()(const vector &x) const
    {
        size_t res = 0;
        for(const auto &v:x) {
            boost::hash_combine(res,call_if_possible(v, 0));
        }
        return res;
    }
};

(如果这hash是实际的std::hash,则答案是"不要这样做".除非专门化取决于用户定义的类型,否则您可能不会专门化标准库模板.)

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有