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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с указателем на функцию, Параметр со значением по умолчанию - как 
:(
    Опции темы
Андреy
Дата 29.3.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. 
Компилятор не пропускает и немного матерится (VC++ 2008):
Код

// В проге будут использоваться функции такого типа, последний параметр можно не указывать
// SomeType F(char *arg1, CSomePointer* parg2 = new CSomePointer)

// Проблема с объявлением указателя на такую функцию:
SomeType (*pFunc)(char *arg1, CSomePointer* parg2 = new CSomePointer);  // компилятор ругается на некорректное использование в этом месте синтакиса "параметр со значением по умолчанию"

// Я не могу объявить указатель вот так:
// SomeType (*pFunc)(char *arg1, CSomePointer* parg2);  
// так как тогда последний параметр станет обязательным.

Подскажите пожалуйста, как выкрутиться? Кстати, есть пример приложения на C++ Builder, где указанная конструкция проходит на ура. Но у меня Visual Studio...

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


uploading...
****


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

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



аргументы по умолчанию не являются частью типа функции.

Цитата(Андреy @  29.3.2010,  21:48 Найти цитируемый пост)
Кстати, есть пример приложения на C++ Builder

В C++ Builder все возможно.

Цитата(Андреy @  29.3.2010,  21:48 Найти цитируемый пост)
Подскажите пожалуйста, как выкрутиться?

Это действительно так сильно нужно?
PM   Вверх
mes
Дата 30.3.2010, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Андреy @  29.3.2010,  20:48 Найти цитируемый пост)
Подскажите пожалуйста, как выкрутиться?


например так :
Код

// .h

void fn (int a, int b = 0);
void fn_set_handler ( void (*) (int, int) );
bool fn_has_handler ();

//.cpp

static void (*fn_ptr) (int, int);

void fn (int a, int b)
{
   if (fn_ptr) fn_ptr (a,b);
}

void fn_set_handler ( void (*pfn) (int, int) )
{
    fn_ptr = pfn;
}

bool fn_has_handler ()
{
     return ! fn_ptr;
}




Это сообщение отредактировал(а) mes - 30.3.2010, 09:01


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


uploading...
****


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

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



можно и проще
Код

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>

void foo(int x, int y)
{
    std::cout << x << " " << y << std::endl;
}

int main ()
{
    boost::function<void (int, int)> function = foo;
    boost::bind(function, _1, 10)(5);

}

PM   Вверх
mes
Дата 30.3.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  30.3.2010,  08:29 Найти цитируемый пост)
можно и проще

1. а проще ли ?
2. а разве это решает задачу тс ?


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


uploading...
****


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

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



Цитата(mes @  30.3.2010,  10:35 Найти цитируемый пост)
1. а проще ли ?

мне кажется да.

Цитата(mes @  30.3.2010,  10:35 Найти цитируемый пост)
2. а разве это решает задачу тс ? 

это зависит от самой задачи, мне показалось, что смысл задачи обеспечить default аргументы при вызове через указатель/делегат, может и не решает.
PM   Вверх
mes
Дата 30.3.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  30.3.2010,  09:39 Найти цитируемый пост)
мне кажется да.

Цитата(azesmcar @  30.3.2010,  09:39 Найти цитируемый пост)
мне показалось, что смысл задачи обеспечить default аргументы при вызове через указатель/делегат, 


дополните тогда свой пример, плиз, под  такое условное  "расширение" задачи топик стартера
Код


SomeType (*pFunc)(char *arg1, CSomePointer* parg2 = SomePointer); 
..
if (pFunc) if ( true ) pFunc (pAnyChar);
           else        pFunc (pAnyChar, AnyPointer);


Это сообщение отредактировал(а) mes - 30.3.2010, 11:07


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


uploading...
****


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

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



Код

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>

class SomeType {};

SomeType foo(char *arg1, SomeType* parg2)
{
    std::cout << arg1 << std::endl;
    return SomeType();
}

int main ()
{
    boost::function<SomeType (char *, SomeType*)> function = foo;

    char * message = "hello world";

    boost::bind(function, _1, new SomeType())(message);
}

PM   Вверх
mes
Дата 30.3.2010, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  30.3.2010,  10:39 Найти цитируемый пост)
    boost::bind(function, _1, new SomeType())(message);

мы явно говорим о разном...
тс, как я понял, хочет иметь возможность вызова некоего колбяка, как с одним параметром, так и с несколькими, при том что клиент не должен заботиться о параметре по умолчанию..  
В приведенном примере, во первых не наблюдается разностороннего вызова, во вторых о дефаултном параметре заботится клиент,
т.е. цитатная строчка это  фактически просто усложненная
Код

function (message, new SomeType());

при том в контексте примера не имеющая выгоды...

к тому же насколько я понимаю bind привяжет одну инстанцию для параметра по умолчанию, а исходя из задания нужна новая для каждого вызова..

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

иль все таки я чего то упустил ?

Это сообщение отредактировал(а) mes - 30.3.2010, 11:57


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


uploading...
****


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

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



Цитата(mes @  30.3.2010,  11:53 Найти цитируемый пост)
если же бинд пристыковывать к переменной, то тогда получится несколько разных переменных, что опять не стыкуется с заданием..

да, я об этом говорил, но вы правы, не стыкуется.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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