Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Опциональный ссылочный аргумент функции - C++

23.02.2014, 09:46. Просмотров 902. Ответов 24
Метки нет (Все метки)

Некоторые аргументы функции можно сделать опциональными, просто поставив значение по умолчанию, а затем проверяя, изменилось ли оно :
C++
1
2
3
4
5
6
7
void someFoo(int important, int *additional = NULL)
{
if (additional != NULL)
{
//do someFoo
}
}
Можно ли сделать так же для ссылочного типа?
C++
1
2
3
4
5
6
7
void someFoo(int important, int &additional) // ???
{
if (additional) //  ??? -> PROFIT
{
//do someFoo
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 09:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Опциональный ссылочный аргумент функции (C++):

Вычислить значение функции аргумент которой вычисляется из другой кусочно заданной функции - C++
Решите программу то я не знаю как:hysteric: Вычислить значение y в зависимости от выбранной функции \varphi (x), аргумент которой...

Безымянный аргумент функции - C++
функция принимает аргумент, но у него нет имени void f(int) { cout << "Hello world!"; } int main() { int n =...

Передача функции в аргумент - C++
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Не читается аргумент функции - C++
void recursReverse(char* str, size_t len) { static size_t len2 = len; while (len2 > 1) { std::swap(*str, *(str + len2 - 1)...

Непонятный аргумент функции - C++
Кто-нибудь может подсказать, что принимает такая функция в качестве аргумента? void foo(int (**i)(double)) { ..... }

Класс как аргумент функции - C++
Доброго времени суток:) Набрёл на такой пример в openGL и не могу понять как он робит, подскажите. Вот описание ф-ции: void...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
23.02.2014, 09:47 #2
Нет, ссылка должна быть инициализирована и не имеет null-семантики (простите за варварские формулировки)
igorrr37
1646 / 1274 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
23.02.2014, 10:27 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void Func(int const& num = 0)
{
    int& num1 = const_cast<int&>(num);
    num1 = 120;
    std::cout << "Func: " << num << '\n';
}
 
 int main ()
 {
     int num = 390;
     Func(num);
     std::cout << num << '\n';
     return 0;
 }
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.02.2014, 11:56 #4
igorrr37, всё-таки речь шла о неконстантной ссылке. Тем более, если в 12 строке будет:
C++
1
const int num
, то получите UB из-за const_cast.
Если нужно просто сделать ссылочное значение по умолчанию, достаточно такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int i = 42;
 
void Func(int& num = i)
{
    std::cout << "Func: " << num << '\n';
}
 
int main()
{
    int num = 390;
    Func(num);
    Func();
    return 0;
}
http://ideone.com/qjbjEj
Но, как уже сказал 0x10 ссылка должна быть инициализирована, т.е. указывать на объект.

А если хочется сделать код максимально похожий на код ТС, то можно предложить такой вариант:
C++
1
2
3
4
5
6
7
8
int i = 0;
void someFoo(int important, int &additional = i) 
{
    if (additional) 
    {
        
    }
}
Однако, здесь не стоит путать нулевое значение целого аргумента и отсутствие значения (как можно было бы интерпретировать с nullptr).
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.02.2014, 18:44  [ТС] #5
Tulosba, безопасно ли делать нечто подобное?
C++
1
2
3
4
5
6
7
8
9
10
11
12
string Foo(string & str = string())
{
//something to exit
Foo(str);
//something to calc
return str;
}
 
int main()
{
Foo();
}
Вроде как должно же быть? По сути, объект создатся локально один раз, будет отправлен по ссылке в рекурсию, после чего вернется в свою проматерь, где создастся его копия, которая вернется в return, а сам он помрет?

Добавлено через 6 минут
Если это нормально, то, выходит, впорядке будет и такое:
C++
1
2
3
4
void Foo(double & x = double(0))
{
//те же условия
}
? Точнее, должно быть впорядке, однако создать подобным образом аргумент примитивного типа не выйдет, а создавать глобавльную переменную - не выход.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.02.2014, 20:14 #6
nexen, во-первых, рекурсия бесконечная. Во-вторых, чтобы это собиралось, надо хотя бы ссылку сделать константной. Ну и с double отличий тогда не будет никаких от варианта со string.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.02.2014, 20:27  [ТС] #7
Tulosba, в рекурсии я в комментах написал, что есть условие на выход.
Без константной ссылки собирается. Проверено.
А double(0) не собирается для неконстантной ссылки, так что тут другое. А хотелось бы, чтобы собиралось
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
24.02.2014, 20:36 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Во-вторых, чтобы это собиралось, надо хотя бы ссылку сделать константной
Это так в соответствии со стандартом (нельзя привязывать не константную ссылку к rvalue), однако студия 2010 и ниже нарушала это правило и позволяла эту конструкцию (как расширение языка).

Добавлено через 19 секунд
Цитата Сообщение от nexen Посмотреть сообщение
Без константной ссылки собирается. Проверено.
См. мой ответ
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.02.2014, 20:53 #9
Цитата Сообщение от DrOffset Посмотреть сообщение
однако студия 2010 и ниже
судя по всему и 2012 допускает.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.02.2014, 20:55  [ТС] #10
Tulosba, DrOffset, но что же тогда делать? Хочется ведь не передавать лишних параметров в функцию, а сделать для рекурсии локальную карту (std::map) для некоторых внутренних нужд, которая должна быть доступна из любого уровня рексии. 2008 студия позволила сделать то, что я описывал выше, благодоря чему такой финт с map работал, но с const map<>& такое не сработает, ибо константа..
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.02.2014, 20:59 #11
Цитата Сообщение от nexen Посмотреть сообщение
для некоторых внутренних нужд, которая должна быть доступна из любого уровня рексии.
Так может быть это должно быть полем класса?
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
24.02.2014, 21:02 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
судя по всему и 2012 допускает.
Да. Однако странная разница в поведении, когда меняется тип с встроенного на не встроенный.

Добавлено через 2 минуты
Цитата Сообщение от nexen Посмотреть сообщение
но что же тогда делать?
В С++11 есть rvalue references.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.02.2014, 15:00  [ТС] #13
DrOffset, можете пример с r-ref показать?
DrOffset
7090 / 4231 / 950
Регистрация: 30.01.2014
Сообщений: 7,006
25.02.2014, 15:09 #14
Цитата Сообщение от nexen Посмотреть сообщение
можете пример с r-ref показать?
C++
1
2
3
4
string Foo(string && str = string())
{
    return str;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.02.2014, 16:24  [ТС] #15
DrOffset, а она разве в случае, когда нужно сделать рекурсию с внутренними данными поможет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 16:24
Привет! Вот еще темы с ответами:

Локальные переменные в функции и её аргумент - C++
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...

Аргумент argv в функции main() - C++
Здравствуйте. Возникли некоторые непонимания при работе с аргументом argv и указателями в целом. Мне сказали, что, при передаче...

Аргумент в виде шаблонной функции - C++
void Function(любая_функция_с_одним_параметром){} Как при помощи шаблона всунуть в аргумент функции, любую функцию с одним параметром,...

Auto как аргумент функции - C++
Возможно ли объявить параметр функции как auto? void func(auto pt); //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.02.2014, 16:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru