Для некоторой кальки автоматизации для идентификации экземпляров Я хочу назвать либо:различение статических и нестатических методов в C++ во время компиляции?
- нестатическим метод, содержащим объект возвращение его идентификатора
- что-то другое, что всегда возвращает тот же идентификатор
Мое текущее решение состоит в том, чтобы иметь базовый класс с методом, который() и глобальная функция, которая() должна использоваться, если не в контексте объекта. Это, однако, не работает для статических функций-членов, здесь компилятор предпочитает нестатический метод над глобальным.
Упрощенный пример:
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
};
Могу ли я каким-то образом избежать использования обходных как специальный макрос для статических функций-членов (возможно, с помощью какой-то шаблон магии)?
Я уверен, что есть способ сделать это, используя указатели функций и используя некоторое связующее для случая функции-члена. Но сначала я задал вопрос дизайну. Почему, по-вашему, вам нужно написать один и тот же код как в статических, так и в нестационарных идентификационных функциях-членах? Как часто, «как я могу решить эту проблему?» возможно, было лучше, чем «Я застрял на этом пути, чтобы решить мою проблему, как мне дальше?» – sbi
Я хочу использовать тот же код, потому что я хочу просто использовать один центральный макрос вместо одного для статического и один для нестатических контекстов. Возможно, дизайн неправильный, но по крайней мере я сам не вижу лучшего. –