Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> параметр по-умолчанию равный другому параметру 
V
    Опции темы
borisbn
Дата 16.3.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Добрый день.
Можно ли указать параметр по-умолчанию в какой-то ф-ции равным одному из других (предыдущих) параметров. Т.е. так
Код

void foo( int * inArr, int count, int * outArr = inArr );

В лоб такое, конечно, не компилируется, но может есть какое-нибудь "красивое" решение ?
Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 16.3.2011, 17:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

void foo(int * inArr, int count, int * outArr) { ... }
void foo(int * inArr, int count)
{
    return foo(inArr, count, inArr);
}

PM   Вверх
borisbn
Дата 16.3.2011, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



azesmcar, спасибо. На поверхности лежало, но... и на старуху...
Однако, есть один нюанс с перегрузкой функций в интерфейсе класса (не так давно столкнулся на работе): студия такие функции меняет местами в интерфейсе:
Код

class Foo {
virtual void __stdcall bar() = 0; // назовём эту ф-цию условно (0)
virtual void __stdcall foo( int ) = 0; // назовём эту ф-цию условно (1)
virtual void __stdcall foo( int, int ) = 0; // назовём эту ф-цию условно (2)
virtual void __stdcall foo( int, int, int ) = 0; // назовём эту ф-цию условно (3)
virtual void __stdcall bar2() = 0; // назовём эту ф-цию условно (4)
};

так вот, для такого класса студия создаст такую виртуальную таблицу
Код

(0)
(3)
(2)
(1)
(4)

не знаю, по стандарту это или нет, но Билдер создаст в прямом порядке, т.е. так, как идёт в описании класса (0,1,2,3,4).
Поэтому нам пришлось отказаться от перегрузки функций в интерфейсе...

А для свободных функций - отличная идея. Буду пользовать. Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 16.3.2011, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



borisbn, Можно и без перегрузки сделать

Код

void foo( int * inArr, int count, int * outArr = 0 )
{
   if (!outArr) outArr = inArr;
   // ...
}

PM MAIL   Вверх
borisbn
Дата 17.3.2011, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, в случае указателя или любого другого типа, у которго есть "несуществующее значение", это будет работать... а другие ?
прекрасно понимаю, что задаю вопрос из серии "Зарабатывать как фирма Apple - знаю... Посоветуйте, как зарабатывать больше..."
интересно, есть ли теоретически способ передать в качестве параметра ф-ции один из предыдущих аргументов ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 17.3.2011, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



borisbn, Ну прямой синтаксис этого не позволяет. Здесь привели 2 трюка, помогающих обойти это ограничение.
Если не подходит не одни, то даже не знаю. остаются только макросы. но их даже не хочу вспоминать...

Насчет не существующих значений. Почти всегда они есть.
Например даже если 0 в вышеприведенном примере используется, в самой функции, например для указания отсутствия данных.
Можно еще такой трюк небольшой проделать.
Используем тот момент, что числа от 0 до 4 точно никогда не будут реальными указателями.
(Это даже зафиксировано официально)
Код

int * const default_pointer = (int *) 1; // Где нибудь 1 раз.

void foo1( int * inArr, int count, int * outArr = default_pointer )
{
    if (outArr == default_pointer) outArr = inArr;
    // ...
}

PM MAIL   Вверх
azesmcar
Дата 17.3.2011, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(borisbn @  16.3.2011,  17:55 Найти цитируемый пост)
так вот, для такого класса студия создаст такую виртуальную таблицу

оно?
http://stackoverflow.com/questions/3243716...vtable-on-win32

Цитата(borisbn @  16.3.2011,  17:55 Найти цитируемый пост)
не знаю, по стандарту

в стандарте виртуальных таблиц вообще нет.


PM   Вверх
mes
Дата 17.3.2011, 09:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  16.3.2011,  23:01 Найти цитируемый пост)
у которго есть "несуществующее значение", это будет работать... а другие ?

пример для размышления :
http://liveworkspace.org/code/c6025f0e7d8b...7537bd4a3cc82ff


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 17.3.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(azesmcar @  17.3.2011,  09:21 Найти цитируемый пост)
оно?http://stackoverflow.com/questions/3243716...vtable-on-win32

в точку.
кстати, если интересно, между студией и билдером отличие vptr на этом не заканчиваются. У них разное выравнивание на 8. Кто-то из них (не помню кто именно) выравнивает все члены класса на 8, а кто-то все, кроме vptr. При выравнивании на 4 - всё одинаково. Проверял только на 32-х битной системе, ессно.


mes, спасибо. красиво. можно ещё (и наверное нужно) сделать default_able_t шаблонной, но... IMHO код будет выглядеть ну совсем не читаемым. Но это моё личное IMHO.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 17.3.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  17.3.2011,  11:42 Найти цитируемый пост)
сделать default_able_t шаблонной, 

ну так все в Ваших руках.. зависит от цели .. я лишь привел 
Цитата(mes @  17.3.2011,  08:40 Найти цитируемый пост)
пример для размышления

 smile 



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 17.3.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



mes, если мне не изменяет память, то во многих БД именно такой механизм (default_able_t) используется ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 17.3.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  17.3.2011,  12:31 Найти цитируемый пост)
 то во многих БД именно такой механизм (default_able_t) используется ? 

не знаю.. не приходилось пользоваться.. 



--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.