powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование значений по умолчанию
16 сообщений из 16, страница 1 из 1
Использование значений по умолчанию
    #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
Использование значений по умолчанию
    #32903829
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько мне исзестно - никак.
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Использование значений по умолчанию
    #32904039
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DubrovНасколько мне исзестно - никак.
---
С уважением, Dubrov.

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

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

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

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


Вариант 1
SomeFunc(1, 10);
Вариант 2 - использовать overloading
...
Рейтинг: 0 / 0
Использование значений по умолчанию
    #32906820
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще можно переставить местами параметры
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Использование значений по умолчанию
    #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
Использование значений по умолчанию
    #32908903
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
лучше уж тогда boost::bind - тут возможны любые комбинации. Но ни в коем разе не надо мудрить со значениями по умолчанию.
...
Рейтинг: 0 / 0
Использование значений по умолчанию
    #32908921
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Код: plaintext
1.
2.
//например
boost::bind( someFunc, value, _1, _2 ) 
...
Рейтинг: 0 / 0
Использование значений по умолчанию
    #32908935
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Я это использовал уже чтобы написать шаблон Охранника(scope guard), причем сделал это на базе boost::tuple, чтобы не пложить кучу локальных переменных. Можно было бы применить канеш шаблон Observer, т.е. boost::signals( scope_connection - представьте себе делегат Шарпа, но завязанный на области видимости ), но там нельзя управлять исключениями внутри вызываемых функций и он потоково небезопасен. Поэтому я выбрал boost::tuple + boost::function + boost::bind. Вешаешь вызов любой функции, с любой сигнатурой, и они вызываются при выходе из области видимости.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Использование значений по умолчанию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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