Для некоторой автоматизации трассировки для идентификации экземпляров я хочу вызвать:
- нестатический метод содержащего объекта, возвращающий его идентификатор
- что-то еще, что всегда возвращает один и тот же идентификатор
Мое текущее решение состоит в том, чтобы иметь базовый класс с методом 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
};
Могу ли я каким-то образом избежать использования обходных путей, таких как специальный макрос для статических функций-членов (возможно, с использованием некоторой магии шаблонов)?