Добавить в переменную __func__ имя класса

max
max

Либо добавить новую переменную __class__, содержащую имя класса в текущем scope. 

14
рейтинг
2 комментария
Andrey Davydov

С __func__ конечно ли выгорит, вендоры его менять не будут, чтобы не ломать обратную совместимость. А идея с __class__, кажется очень интересной.

1. Тут https://groups.google.com/a/isocpp.org/d/topic/std-proposals/1v1al0enOC4/discussion обсуждение макроса __CLASS__.

2. Как эта переменная (если это static поле класса) должно взаимодействовать с лямбдами -- игнорировать их или возвращать какое-то implementation defined имя внутри лямбды? Если второе, то в каких местах __class__ должен ссылаться на лямбду а в каких на внешний класс?

[_name = тут?] (const char * name = тут?) noexcept(тут?) { или только тут? };

3. Что делать с friend-функциями.

class X {
  friend void foo(X) {
    auto s = __class__; // кажется, s == "X";
  }
};

Вынесем определение функции foo из класса:

class X {
  friend void foo(X);
};

void foo(X) {
  auto s = __class__; а тут?
}

4. Сразу же надо рассмотреть добавление метода source_location::class_name(). Может быть, только он и нужен.

Плюс того, чтобы определить static поле __class__ и определить source_location::class_name() через него в том, что у нас есть строгие правила lookup'а, и спорные вопросы, вроде того, должен ли в этом коде

class Derived : Base<__class__> {};

__class__ указывать на Derived::__class__ решается автоматически: нет не должен, в base specifiers мемберы класса Derived не видны.

Субъективным, минусом такого подхода, является то, что полю __class__ можно будет явно доступаться:

struct X {};

auto s = X::__class__; // мы точно этого хотим? в комитете по стандартизации могут сказать, что это надо "дружить" с Reflection TS.

Andrey Davydov
Обновлено 
yndx-antoshkka

У большинства компиляторов есть возможность выводить больше информации чем при использовании __func__ (см BOOST_CURRENT_FUNCTION). Так же готовятся к включению в C++ std::source_location . Уж лучше добавлять в него информацию, чем плодить новые волшебные переменные.
Итого: я за, если в std::source_location добавить новую функцию, для получения полного имя функции.

yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения