Методы и void
От: regnar  
Дата: 27.04.17 18:18
Оценка: -8
Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Re: Методы и void
От: LaptevVV Россия  
Дата: 27.04.17 18:40
Оценка: +4
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Нет. Не согласен.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Методы и void
От: SergeyOsipov Россия  
Дата: 27.04.17 18:41
Оценка:
Здравствуйте, regnar, Вы писали:

R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?


Зачем? Чтоб писать портянки вызовов в одну строчку?
Не C++-style
Re: Методы и void
От: Went  
Дата: 27.04.17 19:02
Оценка: +2
Здравствуйте, regnar, Вы писали:
R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
struct A
{
  A& set_a(int a_)
  {
    a = a_;
    return *this;
  }

  int a;
};
struct B : A
{
  B& set_b(int b_)
  {
    b = b_;
    return *this;
  }

  int b;
};

void main()
{
  B b;
  b.set_a(1).set_b(2); // О куррррьва! Не комплируется, тип срезался!
}


Из-за этого область применения return *this сильно сужается.
Re[2]: Методы и void
От: _NN_ www.nemerleweb.com
Дата: 27.04.17 19:16
Оценка: :))) :)
Здравствуйте, Went, Вы писали:


W>Из-за этого область применения return *this сильно сужается.


Вы просто неправильно готовите C++
#include <iostream>
using namespace std;

template<typename T>
struct A
{
  T& set_a(int a_)
  {
    a = a_;
    cout << "a";
    return static_cast<T&>(*this);
  }

  int a;
};
struct B : A<B>
{
  B& set_b(int b_)
  {
    b = b_;
    cout << "b";
    return *this;
  }

  int b;
};

int main()
{
  B b;
  b.set_a(1).set_b(2); // О боги! Работает!
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Методы и void
От: Dair Россия https://dair.spb.ru
Дата: 27.04.17 20:50
Оценка: +1
Здравствуйте, regnar, Вы писали:

R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?


Все операторы присваивания должны возвращать *this.
Re[3]: Методы и void
От: Went  
Дата: 27.04.17 22:02
Оценка:
Здравствуйте, _NN_, Вы писали:
_NN>Вы просто неправильно готовите C++
Да я понимаю, что для каждого конкретного случая разрулить можно, но в случае топикстартера, мне кажется, оно того не стоит.
Например, оператор << для сериализации в поток. Как только мы попытаемся реализовать иерархию потоков, как опять же впилимся в подобную проблему — оператор сдвига, реализованный для предка, будет срезать тип потока для последующих операндов. И опять же решаемо — нужно заменить перегрузку оператора сдвига на перегрузку свободной функции, а для оператора сдвига реализовать универсальный шаблон. И так далее, но тут хоть смысл какой-то есть. А писать сеты через точку в строчку — это сомнительное вознаграждение за то, чтобы городить шаблоны.
Re[4]: Методы и void
От: Кодт Россия  
Дата: 28.04.17 12:39
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, _NN_, Вы писали:

_NN>>Вы просто неправильно готовите C++
W>Да я понимаю, что для каждого конкретного случая разрулить можно, но в случае топикстартера, мне кажется, оно того не стоит.
W>Например, оператор << для сериализации в поток. Как только мы попытаемся реализовать иерархию потоков, как опять же впилимся в подобную проблему — оператор сдвига, реализованный для предка, будет срезать тип потока для последующих операндов. И опять же решаемо — нужно заменить перегрузку оператора сдвига на перегрузку свободной функции, а для оператора сдвига реализовать универсальный шаблон. И так далее, но тут хоть смысл какой-то есть. А писать сеты через точку в строчку — это сомнительное вознаграждение за то, чтобы городить шаблоны.

Это называется extension method — когда функция пишется в инфиксном стиле, — arg1.foo(other args...) = ::foo(arg1, other args...)
Есть в C# и Ruby.

Есть предложения на эту тему (http://www.open-std.org/JTC1/SC22/wg21/docs/papers/2015/p0079r0.pdf)

Ну или наколхозить своё, по аналогии с iomanip:
std::cout << std::setfill('0')

arg1*ADAPI(foo)(other_args...)

Но там будут сложности с шаблонами и перегрузками foo. Разве что наколхозить ещё глубже, на полиморфных лямбдах.
#define ADAPT(foo) (make_binder{ CONCRETE(foo) })

// засахариваем, потому что foo может быть именем шаблона или перегруженной функции; CONCRETE(foo) - лямбда конкретного типа с полиморфным operator().
#define CONCRETE(FOO) ([](auto... args){ return (FOO)(args...); })

// заворачиваем в тип с operator() выполняющим связывание правых операндов
template<class CF> struct Binder {
  CF cf;
  auto operator()(auto... args) const { return make_launcher([](auto arg1){ cf(arg1,args...); }); }
};
template<class CF> auto make_binder(CF cf) { return Binder<CF>{cf}; }

// результат связывания - тип с оператором *
template<class FARGS> struct Launcher {
  FARGS fargs;
};
template<class FARGS> auto make_launcher(FARGS fargs) { return Launcher<FARGS>(fargs); }

template<class A1> auto operator * (A1&& arg1, Launcher&& launcher) { return launcher.fargs(arg1); }

(понятно, что это эскиз, а не рабочий код)
Перекуём баги на фичи!
Re: Методы и void
От: Muxa  
Дата: 28.04.17 17:05
Оценка:


R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?
Отредактировано 28.04.2017 17:05 Muxa . Предыдущая версия .
Re: Методы и void
От: MasterZiv СССР  
Дата: 02.05.17 12:37
Оценка:
Здравствуйте, regnar, Вы писали:

R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?


Нет.
Re: Методы и void
От: AlexGin Беларусь  
Дата: 03.05.17 12:00
Оценка:
Здравствуйте, regnar, Вы писали:

R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?

Нет, не согласен, т.к. не вижу смысла.
Re[2]: Методы и void
От: B0FEE664  
Дата: 03.05.17 13:06
Оценка:
Здравствуйте, Dair, Вы писали:

R>>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?

D>Все операторы присваивания должны возвращать *this.

Зачем?
И каждый день — без права на ошибку...
Re[3]: Методы и void
От: Dair Россия https://dair.spb.ru
Дата: 03.05.17 13:08
Оценка:
Здравствуйте, B0FEE664, Вы писали:

D>>Все операторы присваивания должны возвращать *this.

BFE>Зачем?

Для записи вида
a = b = c;
Re: Методы и void
От: B0FEE664  
Дата: 03.05.17 13:15
Оценка:
Здравствуйте, regnar, Вы писали:

R>Согласны ли вы с утверждением, что методы класса не должны возвращать void, вместо этого должны возвращать ссылку на *this?


Я согласен. Не могу сказать за все методы, но то, что push_back не возвращает ссылку меня раздражает.
И каждый день — без права на ошибку...
Re[4]: Методы и void
От: uzhas Ниоткуда  
Дата: 03.05.17 13:19
Оценка: +2
Здравствуйте, Dair, Вы писали:

D>Для записи вида

D>
a = b = c;


ценность такой записи под большим вопросом
Re[4]: Методы и void
От: B0FEE664  
Дата: 03.05.17 13:19
Оценка:
Здравствуйте, Dair, Вы писали:

D>>>Все операторы присваивания должны возвращать *this.

BFE>>Зачем?
D>Для записи вида
D>
a = b = c;


И часто вы так пишите?

(У нас в конторе такой стиль запрещёно использовать)
И каждый день — без права на ошибку...
Re[5]: Методы и void
От: night beast СССР  
Дата: 03.05.17 13:23
Оценка:
Здравствуйте, uzhas, Вы писали:

D>>Для записи вида

D>>
a = b = c;


U>ценность такой записи под большим вопросом


из более-менее вменяемых кейсов (возвращаемого значения присваивания) -- передача параметром в функцию.
Re[6]: Методы и void
От: uzhas Ниоткуда  
Дата: 03.05.17 13:29
Оценка:
Здравствуйте, night beast, Вы писали:

NB>из более-менее вменяемых кейсов (возвращаемого значения присваивания) -- передача параметром в функцию.


так?
f(a = b) ?


вменяемость под вопросом
Re[7]: Методы и void
От: night beast СССР  
Дата: 03.05.17 13:33
Оценка:
Здравствуйте, uzhas, Вы писали:

U>так?

U>
U>f(a = b) ?
U>


ага

U>вменяемость под вопросом


ну, я так иногда делаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.