0

所以我正在boost::hash_value为我的类实现一个从共享库导出的覆盖。我希望hash_value每个使用此类的人都可以使用该功能。目前我的 hash_value 函数已导出并在 cpp 文件中定义,即使它只是调用我的类的内联成员。相反,我希望这个 hash_value 函数也被内联以避免不必要的函数调用。目前标题是这样的:

#ifdef MYDLL
#define MY_API __export
#else
#define MY_API __import
#endif

class MY_API MyGUID
{
public:
     ...
     inline size_t Hash() const
     {  return m1 ^ m2; }
     ...
private:
     size_t m1,m2;
};

namespace boost
{
    // Defined in .cpp file; just returns inGUID.Hash();
    MY_API size_t hash_value(const MyGUID &inGUID);
}

但我希望 hash_value 更像:

   namespace boost
    {
        // I'd like to inline this, like so:
        static inline size_t hash_value(const MyGUID &inGUID)
        { 
             return inGUID.Hash();
        }
    }

除了上面的代码在包含它的每个 .cpp 文件中定义 hash_value 之外,很可能会乱扔二进制文件,并且原则上是丑陋的。

撇开函数调用是否会在性能上产生可衡量的差异的问题不谈,我怎样才能让这个共享库的客户端内联我的类的 Hash 函数,这些客户端在像ordered_set 这样的散列容器中使用 MyGUID?

我怀疑它涉及模板,但我不太清楚如何。

4

1 回答 1

1

如果您查看内部boost/functional/hash/hash.hpp,您会看到现有类型的 hash_value 定义如下:

inline std::size_t hash_value(bool v)
{
    return static_cast<std::size_t>(v);
}

如果 boost 已经使用了技术,这就是你的暗示,你也可以安全地做同样的事情!关于您对在头文件中使用效率低下的担忧inline,这正是它被设计为使用的方式,并且由于您的函数只是转发到另一个函数调用,它可能根本不会导致代码大小的增加。

除非你打算用预处理器指令做一些非常花哨的事情,否则使用它没有多大意义static inline,即,如果你只需要这个函数的一个版本,只需将它标记为inline

于 2012-09-12T18:59:05.517 回答