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

标签 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 之外,很可能会乱扔二进制文件,并且原则上很难看。

抛开函数调用是否会在性能上产生可衡量的差异这个问题,我如何才能为这个共享库的客户端内联我的类的哈希函数,这些客户端在哈希容器(如 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 已经使用了 technique,这是你的提示,你可以安全地做同样的事情!关于您对在头文件中使用 inline 效率低下的担忧,这正是它的设计使用方式,并且由于您的函数只是转发到另一个函数调用,因此它可能不会导致代码增加大小。

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

关于c++ - 导出的 C++ 类的 boost::hash_value 内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12382127/

相关文章:

c++ - 具有跨多个 DLL/DSO 的静态成员的模板类

c++ - Lambda 捕获和成员变量

c++ - 为模板类定义一个 Sentinel 节点,一个没有默认构造函数的类?

c++ - QPainter 中的文本比 QPainterPath 中的文本好得多

c++ - openGL不渲染颜色

c++ - 如何使用 CMake 有选择地链接静态或动态 boost 库?

c++ - 使用 boost.python 将通用 C++ 库绑定(bind)到 python

c++ - Ubuntu Qt 链接 boost 日志

c# - OpenGL4Net System.BadImageFormatException

dll - g++:无法识别的选项 '-static-libstdc++'