Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с указателем на функцию


Автор: Андреy 29.3.2010, 21:48
Добрый день. 
Компилятор не пропускает и немного матерится (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...

Автор: azesmcar 30.3.2010, 08:37
аргументы по умолчанию не являются частью типа функции.

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

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

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

Это действительно так сильно нужно?

Автор: mes 30.3.2010, 08:56
Цитата(Андре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;
}



Автор: azesmcar 30.3.2010, 09:29
можно и проще
Код

#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);

}

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

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

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

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

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

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

Автор: mes 30.3.2010, 11:06
Цитата(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);

Автор: azesmcar 30.3.2010, 11:39
Код

#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);
}

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

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

function (message, new SomeType());

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

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

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

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

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

да, я об этом говорил, но вы правы, не стыкуется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)