Open denzor200 opened 3 years ago
Правильно ли я понимаю, что это предложение языкового способа решения этого вопроса от @apolukhin, чтобы получить базовую интроспекцию имён агрегатов? Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис
Правильно ли я понимаю, что это предложение языкового способа решения этого вопроса от @apolukhin, чтобы получить базовую интроспекцию имён агрегатов?
Да, все верно
Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис
Синтаксис стремный, но по изначальной задумке эта конструкция должна оставаться внутри библиотеки и не мозолить глаза разработчикам приложений.
Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис
Хотя я забыл спросить, что у вас конкретно вызывает сомнения в этом синтаксисе. Вы считаете что это не вписывается в концепцию языка, или где либо пересекается с уже существующим синтаксисом? На мой взгляд, каких либо пересечений здесь нет. Еще я хотел бы показать рабочую реализацию в своем форке llvm, это когда у меня руки дойдут до этого..
Хотя я забыл спросить, что у вас конкретно вызывает сомнения в этом синтаксисе. Вы считаете что это не вписывается в концепцию языка, или где либо пересекается с уже существующим синтаксисом?
Мне показалось, что такая конструкция заметно нарушает принцип наименьшего удивления — синтаксис, словно мы берём адрес от class scope. У меня точно нет решения лучше, но я бы начал пробовать что-то в таком направлении:
auto* [first_memptr, second_memptr, third_memptr] = &Aggregate;
auto [first_memptr, second_memptr, third_memptr] = &Aggregate::*;
auto [first_memptr, second_memptr, third_memptr] = Aggregate::*;
Нынешний Structured bindings позволяет нам извлекать ссылки на поля агрегата, при условии что нам известен размер агрегата. Предлагаю дополнительно добавить возможность извлекать member pointers на поля агрегата. Каким я вижу новый синтаксис:
Извлеченные member pointers могут быть constexpr
Так же не забываем, что у некоторых агрегатов не может быть member pointers(например, при наличии битовых полей). В таких случаях придется выдавать ошибку компиляции.