Встроенная функция boost :: hash_value для экспортированного класса C ++

Так что я реализую 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, который включает его, вполне вероятно, засоряет двоичный файл, и в принципе уродливо.

Оставляя в стороне вопрос о том, имеют ли вызовы функций ощутимую разницу в производительности, как я могу получить встроенную хэш-функцию моего класса для клиентов этой общей библиотеки, которые используют MyGUID в хеш-контейнерах, таких как order_set?

Я подозреваю, что это связано с шаблонами, но я не мог понять, как.

0

Решение

Если вы посмотрите внутрь 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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]