Полноценный билдер/конфигуратор объектов.

edc0a91c24342ae88891
edc0a91c24342ae88891

В си структура - это просто набор филдов, и в этом контексте он является полноценным билдером объектов. В  С++ это не так, и designated initializer мало полезен.

 

 

Соответственно - предложение. Определить в рамках type{} внутри {} некое подобие блока конструктора, только ограниченного.

 

Работает в том случае, если определены конструкторы. Конструктор вызывается базовый, либо - можно вызвать нужный

struct type {

  type() {/**/}

  type(int a, int b): a(a), b(b) {}

  void f(int) {}

  int a, b;

};

 

type{} //базовый, если он есть

type{.type(1, 2)}//вызов нужного.

//альтернатива, дефолтная

type{1, 2}

//дефолтный контекст - *this после вызова конструктора. .field == (*this).field

type{.a = 1}//вызов дефолтного конструктора, инициализация поля a

type{1, 2, .a = 3}//вызов type(int, int), инициализация филда a

 

type{.f(10)}//возможно вызывать функции.

 

type{.a = calc(this)}// доступен this

//альтернатива

type{.a = calc(.this)}// доступен this

//филды доступны свободно

type{.a = .b}

type{.a = this->b}

 

Кейсы бесконечны, самое базовое и нужное:

 

std::vector{10, .reserve(.size())}

 

struct options {

  options(): opt0(false), opt1(true), opt2(false) {}//defaults

  bool opt0, opt1, opt2;

};//в современном С++ можно инициализировать поля иначе, выкинув конструктор, но, вроде как, это работает только для standard layout

 

options{.opt0 = true}//defaults + opt0 == true

 

Так же, желательно, чтобы это всё работало в контекстах type name{}, type name = {};

 

Всё это нам даёт возможность не только создать объект, но и сконфигурировать её + получить более мощную инициализацию.

-3
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения