Главный (primary) конструктор для класса

Роман Попов
Роман Попов

Попытка решить две проблемы:

1) В C++ 11 добавили инициализацию полей класса, но нет удобного способа передать параметры из конструктора

2) Часто бывает так что объекты требуют дополнительной инициализации после создания. Удобно если эта инициализация расположена в коде рядом с объявлением поля.

Пример синтаксиса для C++ (взят из Kotlin):

class ClassWithPrimaryCtor (int xInit, int yInit, const string& sInit)  {
    int x = xInit;
    int y = yInit;

    Widget w;
    init {
        w.setName(sInit);
        w.setDims(x,y);
    }
};

 

Прототип для пояснения семантики :

template <unsigned UNIQUE>
struct InitInvoker {
    template <typename T>
    InitInvoker(T && f) { f(); }
};

#define init InitInvoker<__LINE__> __init_##__LINE__ = [this]

class PrimaryCtor {
public:
    int xInit;
    int yInit;
    const std::string &sInit;

    PrimaryCtor(int xInit, int yInit, const std::string &sInit)
    : xInit(xInit), yInit(yInit), sInit(sInit) {}
};


class ClassWithPrimaryCtor : protected PrimaryCtor {
public:
    ClassWithPrimaryCtor(int xInit, int yInit, const std::string &sInit)
    : PrimaryCtor(xInit, yInit, sInit) {}

private:
    int x = xInit;
    int y = yInit;

    Widget w;
    init {
        w.setName(sInit);
        w.setDims(x,y);
    };
};

 

-6
рейтинг
2 комментария
yndx-antoshkka

Уже есть возможность из одного конструктора вызывать другой. Так что ваша идея уже внедрена, только без init и с явной передечей параметров.

yndx-antoshkka
Роман Попов

Ну так идея именно в том чтобы разрешить использовать параметры конструктора в in-class инициалзицации. Где в C++ эта идея уже внедрена? Да, init наверное можно сделать в C++20 с помощью no_unique_address

Роман Попов
Роман Попов

Нашёл ещё одну причину почему это полезно: Унификация compile-time и run-time интерфейсов. Пример:

 

template <unsigned RPTR_W = 10>
class MyFIFO {
public:
    MyFIFO(unsigned WPTR_W = 10) {}

private:
    
    sc_int rptr{RPTR_W}; // OK!
    sc_int wptr{WPTR_W}; // Compile Error!
    sc_int xptr{WPTR_W + WPTR_W}; // Compile Error!
};

 

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