Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование значений по умолчанию / 16 сообщений из 16, страница 1 из 1
07.02.2005, 11:53
    #32903712
LKO
LKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Всем доброго времени суток!

Заранее прошу прощение за возможно дурацкий вопрос:

в C++ можно объявить прототип с указанием значений по умолчанию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//Прототип
int SomeFunc(int iPar_1=  1 , int iPar_2 =  2 );

//Такие вызовы допускаются:

 a = SomeFunc( 5 ,  10 );
 a = SomeFunc( 5 );
 a = SomeFunc();

//Такой вызов не проходит:
 a = SomeFunc(,  10 )

Вопрос такой, как вызвать функцию так, что бы оставить значение по умолчанию для параметра (параметров), стоящего в середине списка, а не в конце?
...
Рейтинг: 0 / 0
07.02.2005, 12:39
    #32903829
Dubrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Насколько мне исзестно - никак.
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
07.02.2005, 14:06
    #32904039
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
DubrovНасколько мне исзестно - никак.
---
С уважением, Dubrov.

Да именно никак

Зато в MSSQL можно
...
Рейтинг: 0 / 0
07.02.2005, 14:16
    #32904064
LKO
LKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
В Visual Basic тоже можно :)

От этого не легче :(

Жаль, очень удобная штука (была бы)
...
Рейтинг: 0 / 0
07.02.2005, 14:48
    #32904165
Sr. Melifaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
А такой вариант не устроит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int SomeFunc(int iPar_1a, int iPar_2a)
{
 int iPar_1 =  1 ;
 int iPar_2 =  2 ;

 if (iPar_1a !=  0 ) iPar_1 = iPar_1a;
 if (iPar_2a !=  0 ) iPar_2 = iPar_2a;
}

SomeFunc( 0 ,  10 );
...
Рейтинг: 0 / 0
07.02.2005, 15:34
    #32904314
Dubrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Sr. MelifaroА такой вариант не устроит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int SomeFunc(int iPar_1a, int iPar_2a)
{
 int iPar_1 =  1 ;
 int iPar_2 =  2 ;

 if (iPar_1a !=  0 ) iPar_1 = iPar_1a;
 if (iPar_2a !=  0 ) iPar_2 = iPar_2a;
}

SomeFunc( 0 ,  10 );

Устроит, но не всегда (причем далеко не всегда). А если мне надо передать произвольное число? Для указателей можно использовать NULL, а вот для других типов - увы.
Так что извините, что есть, то есть.
LKOВ Visual Basic тоже можно :)
В VB, если мне память не изменяет, можно даже порядок аргументов не соблюдать если указывать самому какому формальному параметру какое фактическое значение присваивать (тоже неплохая штука).

Причем для реализации такой фичи разработчикам языка и особенно напрягаться не нужно было, но ... что есть, то есть.
И еще, извините за опечатку. DubrovНасколько мне исзестно - никак.Понятно, что исзестно == известно. Sorry. :-)
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
08.02.2005, 10:48
    #32905448
LKO
LKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Sr. MelifaroА такой вариант не устроит?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int SomeFunc(int iPar_1a, int iPar_2a)
{
 int iPar_1 =  1 ;
 int iPar_2 =  2 ;

 if (iPar_1a !=  0 ) iPar_1 = iPar_1a;
 if (iPar_2a !=  0 ) iPar_2 = iPar_2a;
}

SomeFunc( 0 ,  10 );


Ну да, это первое и наиболее простое решение. Вопрос лишь в том, какое число использовать как флаг, вместо которого подставлять умолчания (это если задача не предполагает использование всего диапазона значений). В Вашем примере это "0", но иногда и его требуется передавать в кач. аргумента...

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

Можно передавать массивы...

Хоть и говорят "если бы, да кабы...", но такой вариант как в VB

Код: plaintext
1.
a = SomeFunc( 1 , 3 ,,, 5 , 7 )

был бы куда удобнее
...
Рейтинг: 0 / 0
08.02.2005, 11:02
    #32905496
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Не советую часто использовать аргументы по умолчанию. Только если они действительно нужны. В остальных случаях лучше перегружать функцию. Так проще надежней и читабельней.
...
Рейтинг: 0 / 0
08.02.2005, 11:11
    #32905532
miniСЛОН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
LKOНу да, это первое и наиболее простое решение. Вопрос лишь в том, какое число использовать как флаг, вместо которого подставлять умолчания (это если задача не предполагает использование всего диапазона значений). В Вашем примере это "0", но иногда и его требуется передавать в кач. аргумента...
есть еще MAX_INT
...
Рейтинг: 0 / 0
08.02.2005, 12:28
    #32905793
Dubrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
miniСЛОН LKOНу да, это первое и наиболее простое решение. Вопрос лишь в том, какое число использовать как флаг, вместо которого подставлять умолчания (это если задача не предполагает использование всего диапазона значений). В Вашем примере это "0", но иногда и его требуется передавать в кач. аргумента...
есть еще MAX_INT
А MAX_INT тоже число, ничем не лучше и ничем не хуже чем любое другое. Тем более что в любом случае придется что-то передавать, а смысл аргумента по умолчанию в том и заключается что не надо ничего помнить, а просто его не указывать.
Есть еще один вариант. Можно вместо, например WORD передавать DWORD. (Что-то подобное используется в ф-циях ввода/вывода C, где getc() возвращает символ, но в int виде, старший байт всегда равен 0 за исключением символа EOF).
Собственно говоря смысл в том, что в функцию передаются наиболее важные параметры, а при необходимости менее важные значения уточняются . Таким образом аргументы функции нужно располагать в порядке убывания их важности.
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
08.02.2005, 18:19
    #32906798
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
LKO
Вопрос такой, как вызвать функцию так, что бы оставить значение по умолчанию для параметра (параметров), стоящего в середине списка, а не в конце?


Вариант 1
SomeFunc(1, 10);
Вариант 2 - использовать overloading
...
Рейтинг: 0 / 0
08.02.2005, 18:28
    #32906820
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
А еще можно переставить местами параметры
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
09.02.2005, 12:32
    #32907900
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Самое простое и интуитивно понятное решение это использовать враппер над функцией, правда, он несколько громоздкий для такой простой фичи, но достигает желаемого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct SomeFuncWrapper
{
      int param1;
      int param2;
      SomeFuncWrapper() : param1( 1 ), param2( 2 ) {}
      int Call()
      {
           return SomeFunc(param1, param2);
      }
};
...
SomeFuncWrapper f;
// меняем умолчание второго параметра
f.param2 =  10 ; 
// вызываем SomeFunc(1, 10)
f.Call();  
...
Рейтинг: 0 / 0
09.02.2005, 18:32
    #32908903
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
лучше уж тогда boost::bind - тут возможны любые комбинации. Но ни в коем разе не надо мудрить со значениями по умолчанию.
...
Рейтинг: 0 / 0
09.02.2005, 18:38
    #32908921
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Код: plaintext
1.
2.
//например
boost::bind( someFunc, value, _1, _2 ) 
...
Рейтинг: 0 / 0
09.02.2005, 18:43
    #32908935
dwl
dwl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование значений по умолчанию
Я это использовал уже чтобы написать шаблон Охранника(scope guard), причем сделал это на базе boost::tuple, чтобы не пложить кучу локальных переменных. Можно было бы применить канеш шаблон Observer, т.е. boost::signals( scope_connection - представьте себе делегат Шарпа, но завязанный на области видимости ), но там нельзя управлять исключениями внутри вызываемых функций и он потоково небезопасен. Поэтому я выбрал boost::tuple + boost::function + boost::bind. Вешаешь вызов любой функции, с любой сигнатурой, и они вызываются при выходе из области видимости.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование значений по умолчанию / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]