Здравствуйте, enji, Вы писали:
E>Здравствуйте, B0FEE664, Вы писали:
BFE>>Моё мнение такое: экономит надо не время записи, а время чтения.
BFE>>Запись:
E>>>f(.a = 1, .b=42);
BFE>>ничем не лучше, а даже хуже, чем:
BFE>>BFE>>const int a = 1;
BFE>>const int b = 42;
BFE>>f(a, b);
E>это все мило, но кто так пишет?
Вы сами так пишите,Автор: enji
Дата: 11.09.14
только вместо локальных констант используете enum.
E>Это просто убивает все однострочники.
Я запись вида:
SendAnswer(.nAnswerNumber = 1, .nAnswerPriority = 42, .nAnswerValue = 42);
буду записывать так:
SendAnswer(
.nAnswerNumber = 1,
.nAnswerPriority = 42,
.nAnswerValue = 42
);
так как читать такое намного проще читать. Однострочники меня не волнуют.
E>Опять же, ты можешь ошибиться и написать f(b, a). А если я напишу f(.b=42, .a=1), то это будет корректно обработано (ну по крайней мере, если применить правила из питона).
E>Далее, функция может иметь аргументы по умолчанию — void f(a = 1, b = 2, c = 3). И ее можно будет вызывать f(.c=4). Твой вариант с константами тут не поможет...
Это хорошие аргументы до тех пор, пока мы не думаем о виртуальных методах.
E>Это к вопросу о нужности лямбд. Зачем нужна лямбда из одной строки, когда можно на 5 строках в другом месте файла изобразить повторно используемый функтор? Вроде как и низачем. Однако ж функторы особо не пишут, и вместо find_if фигачат цикл...
Потому, что для чтения кода важна локальность определения. Редко, когда один и тот же функтор используется более одного раза в программе.
Ну и вообще, предложенный метод не достаточно радикален. Перепутать f(.a=1, .b=42) и f(.a=42, .b=1) тоже довольно просто.
Есть только один по настоящему хардкодный путь: не использовать никаких констант без user-defined суффиксов:
f(1_a, 42_b);
SendAnswer(1_answer_number, 2_answer_priority, 42_answer_value);
а для каждого вида параметра определить свой тип.
Но такой путь коммерчески не выгоден.