C++ 用于导出的C+;的hash#u值内联函数+;班

C++ 用于导出的C+;的hash#u值内联函数+;班,c++,boost,dll,shared-libraries,inline,C++,Boost,Dll,Shared Libraries,Inline,因此,我正在为从共享库导出的类实现一个boost::hash_值覆盖。我希望使用该类的每个人都可以使用该函数。目前,我的hash_值函数是在cpp文件中导出和定义的,尽管它只调用我类的内联成员。相反,我希望这个hash_值函数也被内联,以避免不必要的函数调用。当前标题如下所示: #ifdef MYDLL #define MY_API __export #else #define MY_API __import #endif class MY_API MyGUID { public:

因此,我正在为从共享库导出的类实现一个
boost::hash_值
覆盖。我希望使用该类的每个人都可以使用该函数。目前,我的hash_值函数是在cpp文件中导出和定义的,尽管它只调用我类的内联成员。相反,我希望这个hash_值函数也被内联,以避免不必要的函数调用。当前标题如下所示:

#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_值更像:

   namespace boost
    {
        // I'd like to inline this, like so:
        static inline size_t hash_value(const MyGUID &inGUID)
        { 
             return inGUID.Hash();
        }
    }
除此之外,上面的代码在包含它的每个.cpp文件中定义了hash_值,很可能会乱丢二进制文件,原则上很难看

撇开函数调用是否会对性能产生可测量的影响这一问题不谈,如何为这个共享库的客户机内联类的哈希函数,这些客户机在诸如ordered_set之类的散列容器中使用MyGUID


我怀疑它涉及到模板,但我不太清楚是如何定义的。

如果你查看一下
boost/functional/hash/hash.hpp
你会发现现有类型的hash\u值定义如下:

inline std::size_t hash_value(bool v)
{
    return static_cast<std::size_t>(v);
}
inline std::size\u t哈希值(bool v)
{
返回静态_-cast(v);
}
如果boost已经使用了这种技术,这就是你的暗示,你也可以这样做!关于您担心在头文件中使用
内联
效率低下的问题,这正是它的设计用途,由于您的函数只是转发到另一个函数调用,因此可能根本不会导致代码大小增加


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

,您不需要同时使用
静态
内联
,因为
inline
某种程度上意味着
static
。不,它不是。静态是文件局部作用域,如果没有它,函数将在包含它的每个cpp文件中全局重新定义,因此它会导致链接器冲突(“先前定义的符号”)。“静态”使其在本地为每个cpp文件定义,因此在多个文件中定义不会导致链接器冲突,但它很难看,并且会占用每个文件中的空间。@Vercelop“文件范围”是什么??C++编译器与每个翻译单元,即CPP单独工作。现在,您的头文件也包含在其他cpp中,这并不意味着。@IgorR,是的,我的意思是静态函数的链接器可见性仅限于一个cpp文件。@Vercelop静态函数在包含它的每个cpp中都可见。但是它有内部链接,因此链接器看不到它。