Вам нужно будет различать разные классы где-то , вот несколько вариантов (все полагаются на какой-то идентификатор):
- Добавьте некоторую дополнительную статическую переменную.Не вариант для вас, но, на мой взгляд, лучший путь, если вы стремитесь к читабельности.
- Используйте
this
, как вы предложили:Это, очевидно, генерирует уникальные идентификаторы, но они, как правило, будут нечитаемыми, и их будет трудно различить при растущей длине адреса (так как только один или два символа могут отличаться в длинной адресной строке).Кроме того, адреса могут меняться при каждом запуске приложения (особенно при использовании ASLR), поэтому вы не сможете увидеть, какой именно экземпляр создал какую строку вывода (если это требуется). - Используйте
this
и хэшируйте значение :
Если честно, я не вижу большой разницы в 2), но это может вызвать некоторые дальнейшие идеи.Некоторый уродливый хак может выглядеть так:
#include <iostream>
#include <functional>
#include <cstddef>
class Logger
{
public:
static void log(void* ptr)
{
using hash_type = std::uintptr_t;
std::cout << std::hash<hash_type>{}(reinterpret_cast<hash_type>(ptr))
<< " logged something..." << std::endl;
}
};
Вы также можете рассмотреть , специализирующую std::hash
для ваших классов, и использовать это в выходных данных журнала.Это устранит проблему смены адресов между различными запусками, если все будет реализовано правильно.
Создание идентификатора во время построения (например, путем передачи некоторого идентификатора в конструктор):На самом деле это не вариант, поскольку у вас нет никаких доказательств или контроля, что для каждого класса генерируется уникальный идентификатор - если только вы не используете какую-то (абстрактную) фабрику с доступом к частному конструктору или какой-то глобальный реестр (см. Ниже). Используйте некоторую вспомогательную утилиту, где ваши классы журналирования регистрируются и генерируются уникальные идентификаторы (что-то вроде класса регистрации).Для простых целей регистрации, ИМХО, это раздувание и не добавляет никакого значения по сравнению с 1).
Вывод: Я бы выбрал вариант 1), если читаемость для людей имеетбеспокойство и для 2), если вы просто хотите, чтобы какое-то число различало сообщения журнала (например, для трубопроводов и фильтрации).