boost::hash_value内联函数,用于导出的C++类
boost::hash_value inline function for exported C++ class
因此,我正在为从共享库导出的类实现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();
}
}
除此之外,上面的代码在包含hash_value的每个.cpp文件中都定义了hash_value,很可能会丢弃二进制文件,而且原则上很难看。
抛开函数调用是否会在性能上产生可衡量的差异这一问题不谈,我如何让我的类"哈希函数"为这个共享库的客户端内联,这些客户端在ordered_set等哈希容器中使用MyGUID?
我怀疑它涉及模板,但我不太清楚是怎么回事。
如果您查看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
。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 在用于格式4的arm模拟器中实现功能时的一个问题