导出的C ++类的boost :: hash_value内联函数

时间:2012-09-12 06:10:29

标签: c++ boost dll shared-libraries inline

所以我正在为从我的共享库导出的类实现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之外,很可能乱扔垃圾,原则上很难看。

抛开函数调用是否会在性能上产生可测量的差异的问题,如何让我的类'哈希函数内联为此共享库的客户端在散列容器中使用MyGUID,如ordered_set?

我怀疑它涉及模板,但我无法弄清楚如何。

1 个答案:

答案 0 :(得分:1)

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

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

如果提升已经使用了技术,那么这是你的暗示,你可以安全地做同样的事情!关于在头文件中使用inline的效率低下的问题,这正是它的设计使用方式,因为你的函数只是转发到另一个函数调用,它可能会导致代码大小没有增加。

除非您打算使用预处理程序指令做一些非常好的事情,否则使用static inline没有多大意义,即,如果您只需要此函数的一个版本,则将其标记为inline