cpp-ru / ideas

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

Structured bindings for member pointers #468

Open denzor200 opened 3 years ago

denzor200 commented 3 years ago

Нынешний 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(например, при наличии битовых полей). В таких случаях придется выдавать ошибку компиляции.

oficsu commented 3 years ago

Правильно ли я понимаю, что это предложение языкового способа решения этого вопроса от @apolukhin, чтобы получить базовую интроспекцию имён агрегатов? Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис

denzor200 commented 3 years ago

Правильно ли я понимаю, что это предложение языкового способа решения этого вопроса от @apolukhin, чтобы получить базовую интроспекцию имён агрегатов?

Да, все верно

Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис

Синтаксис стремный, но по изначальной задумке эта конструкция должна оставаться внутри библиотеки и не мозолить глаза разработчикам приложений.

denzor200 commented 3 years ago

Идея интересная, но у меня почему-то вызывает сомнения сам синтаксис

Хотя я забыл спросить, что у вас конкретно вызывает сомнения в этом синтаксисе. Вы считаете что это не вписывается в концепцию языка, или где либо пересекается с уже существующим синтаксисом? На мой взгляд, каких либо пересечений здесь нет. Еще я хотел бы показать рабочую реализацию в своем форке llvm, это когда у меня руки дойдут до этого..

oficsu commented 2 years ago

Хотя я забыл спросить, что у вас конкретно вызывает сомнения в этом синтаксисе. Вы считаете что это не вписывается в концепцию языка, или где либо пересекается с уже существующим синтаксисом?

Мне показалось, что такая конструкция заметно нарушает принцип наименьшего удивления — синтаксис, словно мы берём адрес от 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::*;