ideas
ideas copied to clipboard
Structured bindings for member pointers
Нынешний Structured bindings позволяет нам извлекать ссылки на поля агрегата, при условии что нам известен размер агрегата. Предлагаю дополнительно добавить возможность извлекать member pointers на поля агрегата. Каким я вижу новый синтаксис:
struct Aggregate
{
int first;
char second;
double third;
};
auto [first_memptr, second_memptr, third_memptr] = &Aggregate::;
auto obj = Aggregate{};
obj.*first_memptr = 100;
obj.*second_memptr = 'c';
obj.*third_memptr = 3.14;
std::cout << obj.first << " " << obj.second << " " << obj.third << std::endl; ///< will print "100 c 3.14"
Извлеченные member pointers могут быть constexpr
constexpr auto tuple_of_memptrs() noexcept {
auto [first_memptr, second_memptr, third_memptr] = &Aggregate::;
return std::tuple{first_memptr, second_memptr, third_memptr};
}
constexpr auto memptrs = tuple_of_memptrs();
Так же не забываем, что у некоторых агрегатов не может быть member pointers(например, при наличии битовых полей). В таких случаях придется выдавать ошибку компиляции.
Правильно ли я понимаю, что это предложение языкового способа решения этого вопроса от @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::*;