Идеи про оператор = после определения методов классов.

int33h-tm
int33h-tm

Предложение 1: автоопределение методов.

Предлагаю сделать возможность сказать компилятору, чтобы какой-то метод он определил на основе уже имеющихся...
Допустим что для некоторого класса мы реализовали оператор ==, а теперь хотим определить оператор !=. В большинстве случаев реализация будет примерно следующей:

 

class Type{
    ...
public:
    ...
    friend bool operator == (const Type& left, const Type& right);
    friend bool operator != (const Type& left, const Type& right);
    ...
};

bool operator == (const Type& left, const Type& right) {

...

}

bool operator != (const Type& left, const Type& right) {return !(left == right);}

Понятно, что второй оператор компилятор может сгенерировать и сам, как он это делает с конструктором и оператором копирования по умолчанию. Поэтому можно сказать ему например такую фразу:

class Type{
    ...
public:
    ...
    friend bool operator == (const Type& left, const Type& right);
    friend bool operator != (const Type& left, const Type& right) = auto;
    ...
};

И оставить генерацию кода на компиляторе...
P.S. Также, возможно, стоит запретить генерацию методов по умолчанию и заставлять програмистов прописовать их таким образом, чтобы "вскрыть" неявное...
P.P.S. Еще парочку примеров на идею:

class Type{
    ...
public:
    ...
    void __copy__(const Type& another); //специальный метод копирования класса
    //занимается только копированием внутренних полей класса
    Type(const Type& another) = auto; //используем __сopy__
    const Type& operator=(const Type& another) = auto; //используем __copy__
    ...
    friend bool operator<(const Type& left, const Type& right);
    friend bool operator<=(const Type& left, const Type& right) = auto; 
    //return (left < right)||(left == right);
    friend bool operator>(const Type& right, const Type& right) = auto;
    //return !((left < right)||(left == right));
    friend bool operator>=(const Type& right, const Type& right) = auto;
    //return !(left < right);
    ...
};

//Компилятор должен контролировать возвращаемое значение и передаваемые аргументы для auto методов.
//В случае несовпадения с шаблоном auto, выдавать соответсвующую ошибку с предлагаемым решением.

Предложение 2: механизм связываний

Тот же самый оператор позволяет заменить и inline функции:

class Type{
    ...
public:
    ...
    void do_something(int a, int b);
    void do_something2(int a) = do_something(a, 5); 
    //подстановка вместо do_something2(c);
    //do_something(c, 5);
    ...
}

//если требуется больше одной инструкции, то все они помещаются в {}.
//void do_something2(int a) = {do_something(a, 5); do_something(5, a);}

 

-6
рейтинг
5 комментариев
Михаил Мальцев
Разные идеи насчёт генерации операторов сравнения уже активно обсуждаются в комитете:
open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0221r2.html
open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0481r0.pdf
open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0436r1.pdf
open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0515r0.pdf
Михаил Мальцев
int33h-tm
Михаил Мальцев, теперь я увидел, спасибо. Тогда у меня остается только одно желание, чтобы все эти генерации по умолчанию были явными, иначе проблем не избежать...
int33h-tm
ru.night.beast
>Предложение 2:

int foo (int a, int b);
auto foo (int a) -> auto { return foo(a, 5); }
ru.night.beast
int33h-tm
ru.night.beast, хорошо когда эти две функции рядом... А когда между ними еще 20 строк кода? Да и этот код не гарантирует того, что он будет вставлен вместо перегруженной функции foo. Идея состояла в том, чтобы сделать inline функции своеобразными мнемониками для других функций или команд.
int33h-tm
ru.night.beast
int33h-tm> хорошо когда эти две функции рядом... А когда между ними еще 20 строк кода?

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