Для некоторой автоматизации трассировки для идентификации экземпляров я хочу позвонить либо:
- нестатический метод содержащего объекта, возвращающий его идентификатор
- что-то еще, что всегда возвращает тот же идентификатор
Мое текущее решение - иметь базовый класс с методом which () и глобальной функцией which (), которая должна использоваться, если не в контексте объекта.
Это, однако, не работает для статических функций-членов, здесь компилятор предпочитает нестатический метод по сравнению с глобальным.
Упрощенный пример:
class IdentBase
{
public:
Ident(const std::string& id) _id(id) {}
const std::string& which() const { return _id; }
private:
const std::string _id;
};
const std::string& which() { static const std::string s("bar"); return s; }
#define ident() std::cout << which() << std::endl
class Identifiable : public IdentBase
{
public:
Identifiable() : Ident("foo") {}
void works() { ident(); }
static void doesnt_work() { ident(); } // problem here
};
Можно ли как-то избежать использования обходных путей, таких как специальный макрос, для статических функций-членов (возможно, с использованием некоторой магии шаблона)?