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

Приведение указателя на функцию - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Selendis
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
30.06.2011, 18:42     Приведение указателя на функцию #1
Здравствуйте, у меня простейший вопрос, но самому не догнать что-то...

В качестве аргумента некой функции используется указатель на функцию, например вот так:
C++
1
void g( int (*f)(int i))
А у меня в силу некоторых причин имеется
C++
1
2
3
4
5
class A
{
public:
  int f1(int i);
}
Собственно, как бы привести f1 к виду, требуемому в функции g? Ведь формально f1 - это :

C++
1
 int (A::*f1)(int i)
Т.е. меня интересует именно преобразование при вызове g, что-то в стиле
C++
1
g((int)(*)a->f1)
или как-то так...
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
30.06.2011, 18:47     Приведение указателя на функцию #2
Возможно как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class A{
public:
  A(int i = 0) : i_(i) {}
  int double_val(int i) { return i_ + i;}
  int i_;
};
 
void g(int (*p)(int i))
{
  std::cout << "gdf";
}
 
int main(){
  int (A::*func)(int);//Указатель на функцию член
  A ob(4);
  func = &A::double_val;
  g(reinterpret_cast<int (*)(int)>(func));
  return 0;
}
но хз верно ли.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
30.06.2011, 18:56     Приведение указателя на функцию #3
Цитата Сообщение от asics Посмотреть сообщение
но хз верно ли.
Только если не пытаться использовать в g полученный указатель
Функция член получает неявный параметр, так что такое преобразование хоть и компилируется, но работать не будет

Добавлено через 1 минуту
Цитата Сообщение от Selendis Посмотреть сообщение
Собственно, как бы привести f1 к виду, требуемому в функции g? Ведь формально f1 - это :
Формально это очень разные прототипы.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
30.06.2011, 18:56     Приведение указателя на функцию #4

Не по теме:

Да да, только что проверил - run-time error


Да и укаатель на член класса -- это необычный указатель, он задает смещение внутри обьекта соответсвующего класса.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
30.06.2011, 19:22     Приведение указателя на функцию #5
Selendis, я конечно не знаю в чём состоит задача, но может быть подойдёт вариант с шаблонами и объектами-функциями? Вот, схематично, идея:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
 
using namespace std;
 
// функция передаётся через шаблон
template <typename F>
void g( F f)
{
    cout << "I'm g\n";
    int r = f(123);
    cout << "r=" << r << endl;
}
 
class A
{
public:
  int f1(int i)
  {
    cout << "I'm f1("<< i <<") from A\n";
    return 456;
  };
};
 
// адаптер в виде объекта-функции
class FuncObj
{
public:
    FuncObj(A const &a) : aobj(a) {}
    int operator() (int i)
    {
        return aobj.f1(i);
    }
private:
    FuncObj();
    A aobj;
};
 
// обычная функция
int simple(int i)
{
    cout << "I'm simple(" << i << ")\n";
    return 789;
}
 
int main()
{
    A a;
    g(FuncObj(a));
    g(simple);
    return 0;
}
Selendis
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
30.06.2011, 19:25  [ТС]     Приведение указателя на функцию #6
Тогда я на такой вопрос хотел бы ответ получить -

Можно ли использовать в качестве обработчика действий в окне - ну, вот этой штуки
C++
1
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
экземплярную функцию?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
30.06.2011, 19:27     Приведение указателя на функцию #7
Selendis, а от какого объекта она должна вызываться?
Самое простое, это сделать функцию-обёртку. А в ней уже вызывать функцию объекта обычным способом.

Добавлено через 53 секунды
Но сам объект тогда должен быть либо глобальным, либо статическим.
Selendis
1 / 1 / 0
Регистрация: 15.02.2011
Сообщений: 43
30.06.2011, 19:43  [ТС]     Приведение указателя на функцию #8
Очень внимательно прочитал, слегка не понял.
Я хочу, чтобы обработчик "принадлежал" текущему экземпляру класса, потому как внутри его используются экземплярные данные.

У меня есть установщик, грубо говоря SetInputHandler, получающий указатель на функцию-член и есть lpinputProc(uMsg, wParam, xPos, yPos ), которому в SetInputHandler я просто присваиваю аргумент.

Если сделать dummy, то это будет в стиле
C++
1
2
3
4
void DummiProc(...прототип такой же, как и у lpinputProc)
{
 Вызов функции-аргумента SetInputHandler;
}
Видимо, в вызове мне и понадобится глобальность. (статичность я не хочу, допустим)
А могу ли я избавиться от глобальности, если засуну DummyProc в желаемый класс?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2011, 19:56     Приведение указателя на функцию
Еще ссылки по теме:

Приведение типа указателя на метод C++
Приведение типа указателя C++
C++ Использование указателя на функцию

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
30.06.2011, 19:56     Приведение указателя на функцию #9
Я не знаю способа, как использовать в качестве обычной callback-функции функцию конкретного неглобального экземпляра класса. Если кто знает, то и самому интересно будет узнать.
То есть экземпляр не обязательно должен быть глобальным, но совсем без глобальной переменной всё-равно не знаю как обойтись.
Yandex
Объявления
30.06.2011, 19:56     Приведение указателя на функцию
Ответ Создать тему
Опции темы

Текущее время: 00:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru