вызывать функцию/метод с именами аргументов
От: sci_reseacher  
Дата: 21.04.16 08:34
Оценка:
возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?

ну например как в Python
>>> def funct(a,b): return a**2+b**3
... 
>>> funct(a=2,b=1)
5
Re: вызывать функцию/метод с именами аргументов
От: Chorkov Россия  
Дата: 21.04.16 08:41
Оценка: 4 (2)
Здравствуйте, sci_reseacher, Вы писали:

_>возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?


_>ну например как в Python

_>
>>>> def funct(a,b): return a**2+b**3
_>... 
>>>> funct(a=2,b=1)
_>5
_>


Стандартными средствами — нельзя.
Можно воспользоваться библиотекой boost.parameter : http://www.boost.org/doc/libs/1_57_0/libs/parameter/doc/html/index.html
Re: вызывать функцию/метод с именами аргументов
От: Erop Россия  
Дата: 21.04.16 09:06
Оценка:
Здравствуйте, sci_reseacher, Вы писали:

_>ну например как в Python

_>
>>>> def funct(a,b): return a**2+b**3
_>... 
>>>> funct(a=2,b=1)
_>5
_>



Стандартный способ это делать
1) в С:
передавать параметры структурой.
struct f_params params = {};
params.a = 2;
params.b = 1;
f( &params );


2) В С++
вместо сложной функции с хитрыми параметрами, сделать класс, каждый объект которого эквивалентен одному вызову функции:
f_mechanism f;
f.SetA( 2 );
f.SetB( 1 );
f.Run();


Но есть несколько вариантов разной степени навёрнутости шаблонной и макросной магии.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: вызывать функцию/метод с именами аргументов
От: sci_reseacher  
Дата: 21.04.16 09:41
Оценка:
Здравствуйте, Erop, Вы писали:


E>2) В С++

E>вместо сложной функции с хитрыми параметрами, сделать класс, каждый объект которого эквивалентен одному вызову функции:
E>
E>f_mechanism f;
E>f.SetA( 2 );
E>f.SetB( 1 );
E>f.Run();


Ну а если такая ситуация: в алгоритме принимает участие указатель на базовый класс, а много параметров появляется в потомках, то предусмотреть все setParam в базовом классе будет не возможным. Их нужно в конструкторе определять.
base *b;
switch(select){
case 1:
    b = new specific_class(/*много параметров здесь*/);
// ...
}
b->work();
Re[3]: вызывать функцию/метод с именами аргументов
От: SaZ  
Дата: 21.04.16 09:43
Оценка: +1
Здравствуйте, sci_reseacher, Вы писали:


_>Ну а если такая ситуация: в алгоритме принимает участие указатель на базовый класс, а много параметров появляется в потомках, то предусмотреть все setParam в базовом классе будет не возможным. Их нужно в конструкторе определять.


Это у вас проблема с проектированием базового класса. Базовый класс не должен знать ничего о конкретной реализации потомков.
Вы случайно не фабрику изобретаете?
Отредактировано 21.04.2016 9:45 SaZ . Предыдущая версия .
Re[3]: вызывать функцию/метод с именами аргументов
От: Erop Россия  
Дата: 21.04.16 09:49
Оценка: 1 (1) +1
Здравствуйте, sci_reseacher, Вы писали:

_>Ну а если такая ситуация: в алгоритме принимает участие указатель на базовый класс, а много параметров появляется в потомках, то предусмотреть все setParam в базовом классе будет не возможным. Их нужно в конструкторе определять.

_>
_>base *b;
_>switch(select){
_>case 1:
_>    b = new specific_class(/*много параметров здесь*/);
_>// ...
_>}
b->>work();
_>


case1: {
        auto res = new specific_class;
        res->SetA( 2 );
        res->SetB( 1 );
        b = res;
    } break;
только я бы ещё и case убрал, а сделал сразу мэппинг в соответстсвующие make-функции

base* make_specific_class()
{
        auto res = new specific_class;
        res->SetA( 2 );
        res->SetB( 1 );
    return res;
}
А мэппинг собирал бы статическими регистраторами... Тогда добавление ещё одного наследника было бы удобным...

Но те, кто это всё не любят, иногда делают так.
1) Возвращают из методов SetXXX this и пишут примерно так:
base *b;
switch(select){
case 1:
    b = (new specific_class) 
        -> SetA( 2 )
        -> SetB( 1 );
// ...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: вызывать функцию/метод с именами аргументов
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 21.04.16 09:56
Оценка:
Здравствуйте, sci_reseacher, Вы писали:

_>возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?


void f(int a, int b);
void f(int b, int a);

f(.a = 10, .b = 20); // Что должно вызываться?
Re: вызывать функцию/метод с именами аргументов
От: Mr.Delphist  
Дата: 21.04.16 10:10
Оценка: +1
Здравствуйте, sci_reseacher, Вы писали:

_>возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?


Давайте начнём с "корня зла": почему Вам требуется вызов функции с именованием параметров? Исходя из ситуации, можно подобрать лечение.
Re[2]: вызывать функцию/метод с именами аргументов
От: sci_reseacher  
Дата: 21.04.16 11:13
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

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


_>>возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?


MD>Давайте начнём с "корня зла": почему Вам требуется вызов функции с именованием параметров? Исходя из ситуации, можно подобрать лечение.


стремление писать эстетичный код )
Re[3]: вызывать функцию/метод с именами аргументов
От: Кодт Россия  
Дата: 21.04.16 11:20
Оценка:
Здравствуйте, sci_reseacher, Вы писали:

MD>>Давайте начнём с "корня зла": почему Вам требуется вызов функции с именованием параметров? Исходя из ситуации, можно подобрать лечение.

_>стремление писать эстетичный код )

Переходи на тёмную сторону — в смолтоке, ObjC (и ObjC++) функции именуются ровно так: [obj callWithX:x andY:(y1+y2) andZ:222]
Перекуём баги на фичи!
Re[2]: вызывать функцию/метод с именами аргументов
От: _hum_ Беларусь  
Дата: 21.04.16 11:41
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

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


_>>возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?


MD>Давайте начнём с "корня зла": почему Вам требуется вызов функции с именованием параметров? Исходя из ситуации, можно подобрать лечение.


"а можно я? (тянет руку)"

хочется вместо
launch_rocket(62, 53, false);

launch__rocket(latitude = 62, longitude =  53, is_northern_latitude = false);
Re[3]: вызывать функцию/метод с именами аргументов
От: SaZ  
Дата: 21.04.16 11:53
Оценка:
Здравствуйте, _hum_, Вы писали:

__>хочется вместо

__>
__>launch_rocket(62, 53, false);
__>

__>
__>launch__rocket(latitude = 62, longitude =  53, is_northern_latitude = false);
__>


http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4172.htm
Re[3]: вызывать функцию/метод с именами аргументов
От: PM  
Дата: 21.04.16 12:34
Оценка:
Здравствуйте, _hum_, Вы писали:

__>"а можно я? (тянет руку)"


__>хочется вместо

__>
__>launch_rocket(62, 53, false);
__>

__>
__>launch__rocket(latitude = 62, longitude =  53, is_northern_latitude = false);
__>


Такое не пройдет из-за того, что объявить функцию можно в разных единицах трансляции с разными именами:

// 1.cpp
int fun(int x, int y);
fun(y = 1, x = 2);

// 2.cpp
int fun(int y, int x);
fun(y = 1, x = 2);

// 3.cpp
int fun(int z, int a) { return z - a; }


Недавно поступило очередное предложение: https://groups.google.com/a/isocpp.org/d/topic/std-proposals/gtGWEUtATU4/discussion

Так что верьте и надейтесь
Re[3]: вызывать функцию/метод с именами аргументов
От: Mr.Delphist  
Дата: 21.04.16 12:36
Оценка:
Здравствуйте, sci_reseacher, Вы писали:

MD>>Давайте начнём с "корня зла": почему Вам требуется вызов функции с именованием параметров? Исходя из ситуации, можно подобрать лечение.


_>стремление писать эстетичный код )


Эстетика — штука вкусовая. Тут народ друг друга убивает на тему "отступы: пробелы vs табы", а когда приканчивают сторонников табов, начинают братоубийство на тему "сколько именно пробелов".

Вы с практической стороны ответьте: зачем требуется именование параметров. Может, прощу будет сериализованную строку пихать в метод, а он уж разберётся что к чему. Или структуру/DTO, как советовали выше. Или вообще кодогенерация сможет выручить, если есть рулы, по которым можно генериться.
Re[4]: вызывать функцию/метод с именами аргументов
От: _hum_ Беларусь  
Дата: 21.04.16 13:17
Оценка:
Здравствуйте, PM, Вы писали:

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


__>>"а можно я? (тянет руку)"


__>>хочется вместо

__>>
__>>launch_rocket(62, 53, false);
__>>

__>>
__>>launch__rocket(latitude = 62, longitude =  53, is_northern_latitude = false);
__>>


PM>Такое не пройдет из-за того, что объявить функцию можно в разных единицах трансляции с разными именами:


я отвечал не на "как?", а на "зачем?"
Re[4]: вызывать функцию/метод с именами аргументов
От: _hum_ Беларусь  
Дата: 21.04.16 13:17
Оценка:
Здравствуйте, SaZ, Вы писали:

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


__>>хочется вместо

__>>
__>>launch_rocket(62, 53, false);
__>>

__>>
__>>launch__rocket(latitude = 62, longitude =  53, is_northern_latitude = false);
__>>


SaZ>http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4172.htm


которое так и осталось предложением
Re: вызывать функцию/метод с именами аргументов
От: Vamp Россия  
Дата: 21.04.16 13:23
Оценка:
_>возможно ли в С++ при вызове функции или метода кроме значений фактических параметров указывать имена параметров?
В С++ самом по себе — нельзя. Но желающих странного довольно много, так что есть странноватый Boost.Paramter: http://www.boost.org/doc/libs/1_60_0/libs/parameter/doc/html/index.html
Да здравствует мыло душистое и веревка пушистая.
Re[3]: вызывать функцию/метод с именами аргументов
От: Ops Россия  
Дата: 21.04.16 18:32
Оценка:
Здравствуйте, sci_reseacher, Вы писали:

_>стремление писать эстетичный код )


Код в первую очередь должен быть понятен другим и вызывать наименьшее удивление, так что переходи на другой язык, где такие конструкции обычны.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: вызывать функцию/метод с именами аргументов
От: SaZ  
Дата: 22.04.16 11:49
Оценка:
Здравствуйте, _hum_, Вы писали:

__>которое так и осталось предложением


Всё правильно. Им тоже хочется, как и вам. Но лично мне не хочется. И коммитету по стандартизации, видимо, тоже
Re[6]: вызывать функцию/метод с именами аргументов
От: _hum_ Беларусь  
Дата: 22.04.16 12:05
Оценка:
Здравствуйте, SaZ, Вы писали:

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


__>>которое так и осталось предложением


SaZ>Всё правильно. Им тоже хочется, как и вам. Но лично мне не хочется. И коммитету по стандартизации, видимо, тоже


или не можется (см. пост PM о технических трудностях)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.