所以我正在为从我的共享库导出的类实现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?
我怀疑它涉及模板,但我无法弄清楚如何。
答案 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