cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

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

Closed apolukhin closed 1 year ago

apolukhin commented 3 years ago

Перенос предложения: голоса +15, -0 Автор идеи: max

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

apolukhin commented 3 years ago

Andrey Davydov, 13 августа 2018, 22:56 С 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'а, и спорные вопросы, вроде того, должен ли в этом коде
```cpp
class Derived : Base<__class__> {};

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

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

struct X {};

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

yndx-antoshkka, 21 августа 2018, 15:36

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

apolukhin commented 3 years ago

GCC выводит полное имя, вместе с именем класса https://godbolt.org/z/r6nPjxfvc но стандарт не обязывает так делать http://eel.is/c++draft/support.srcloc.cons

Послежу за другими компиляторами, заведу багрепорты если будет другое поведение

apolukhin commented 1 year ago

GCC и Clang проставляют полное имя в std::source_location::function_name(). MSVC тоже проставляет по возможности полное имя https://github.com/microsoft/STL/blob/adea8d5ae280cafb91ae69b8dfaecd1c37a847d9/stl/inc/source_location#L23