Closed apolukhin closed 1 year ago
Andrey Davydov, 13 августа 2018, 22:56 С func конечно ли выгорит, вендоры его менять не будут, чтобы не ломать обратную совместимость. А идея с class, кажется очень интересной.
Тут https://groups.google.com/a/isocpp.org/d/topic/std-proposals/1v1al0enOC4/discussion обсуждение макроса CLASS.
Как эта переменная (если это static поле класса) должно взаимодействовать с лямбдами -- игнорировать их или возвращать какое-то implementation defined имя внутри лямбды? Если второе, то в каких местах class должен ссылаться на лямбду а в каких на внешний класс?
[_name = тут?] (const char * name = тут?) noexcept(тут?) { или только тут? };
Что делать с 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 добавить новую функцию, для получения полного имя функции.
GCC выводит полное имя, вместе с именем класса https://godbolt.org/z/r6nPjxfvc но стандарт не обязывает так делать http://eel.is/c++draft/support.srcloc.cons
Послежу за другими компиляторами, заведу багрепорты если будет другое поведение
GCC и Clang проставляют полное имя в std::source_location::function_name()
. MSVC тоже проставляет по возможности полное имя https://github.com/microsoft/STL/blob/adea8d5ae280cafb91ae69b8dfaecd1c37a847d9/stl/inc/source_location#L23
Перенос предложения: голоса +15, -0 Автор идеи: max
Либо добавить новую переменную class, содержащую имя класса в текущем scope.