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

Можно ли передать в функцию указатель на перегруженный оператор? - C++

Восстановить пароль Регистрация
 
GysevVlad
0 / 0 / 0
Регистрация: 19.02.2014
Сообщений: 10
24.02.2014, 02:29     Можно ли передать в функцию указатель на перегруженный оператор? #1
Снова здравствуйте)

Можно ли передать в функцию указатель на перегруженный оператор и как? Что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class f 
{
        ...
    int operator ()(int y)
    {
        cout<<"win!!!";
        return 2+y;
    }
        ...
};
 
int fun(int x(int))
{
    return x(34);
}
 
int main()
{
    f a;
    cout<<fun(какая-то магия);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2014, 02:29     Можно ли передать в функцию указатель на перегруженный оператор?
Посмотрите здесь:

Как передать параметр типа "указатель на указатель" в функцию? C++
Как передать указатель на функцию в функцию C++
Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) C++
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
Передать в неуправляемую функцию указатель на указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.02.2014, 04:13     Можно ли передать в функцию указатель на перегруженный оператор? #2
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
#include <iostream>                                                               
#include <functional>                                                             
                                                                                  
using std::placeholders::_1;                                                      
                                                                                  
class F                                                                           
{                                                                                 
public:                                                                           
    int operator ()(int y)                                                        
    {                                                                             
        return 2+y;                                                               
    }                                                                             
};                                                                                
                                                                                  
template <typename fptr>                                                          
int fun(fptr f)                                                                   
{                                                                                 
    return f(34);                                                                 
}                                                                                 
                                                                                  
int fun1(std::function<int (int)> f)                                              
{                                                                                 
    return f(34);                                                                 
}                                                                                 
                                                                                  
int main()                                                                        
{                                                                                 
    F f;                                                                          
    std::cout << fun(std::bind1st(std::mem_fun(&F::operator()), &f)) << std::endl;
    std::cout << fun1(std::bind(&F::operator(), &f, _1)) << std::endl;            
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.02.2014, 04:23     Можно ли передать в функцию указатель на перегруженный оператор? #3
Цитата Сообщение от GysevVlad Посмотреть сообщение
Можно ли передать в функцию указатель на перегруженный оператор и как? Что-то типа:
Зачем его передавать? Если нужно использовать в функции, то можно и так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class f 
{
public:
    
    int operator ()(int y)
    {
        cout<<"win!!!";
        return 2 + y;
    }
        
};
 
int fun(int x)
{
    f a;
    return a(x);
}
 
int main()
{
    f a;
    cout << fun(34);
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.02.2014, 04:27     Можно ли передать в функцию указатель на перегруженный оператор? #4
собсно тут два пути
1) использовать старые недобрые функции (c++98), генерящии врапперы вокруг member function
&F::operator - pointer to member
std::mem_fun(&F::operator()), &f) - генерирует функтор, принимающий два аргумента - F* (указатель объекта, у которого вызывается member function) и int - непосредственно аргумента F::operator()(int)
дальше биндим первый аргумент (F*) на поинтер объекта - std::bind1st(std::mem_fun(&F::operator()), &f)
к сожалению получившийся функтор имеет тип, непригодный для определения функции (он унаследован от std::unary_function, но в unary_function однако не определен operator()(Arg)) - поэтому для простоты можно позволить компилятору вывести тип из шаблона.
Второй вариант (более адекватный) - использовать bind/function из c++11 / boost
В с++11 можно при желании сконтруировать функтор не через bind, а заданием лямбды (3ий вариант)

C++
1
2
3
4
5
6
7
8
9
int fun2(std::function<int (int)> f) { 
    return f(34);                      
}                                      
                                       
int main()                                                                          
{                                                                                   
    F f;                                                                                  
    std::cout << fun2([&f](int arg){ return f(arg); }) << std::endl;                
}
GysevVlad
0 / 0 / 0
Регистрация: 19.02.2014
Сообщений: 10
24.02.2014, 17:17  [ТС]     Можно ли передать в функцию указатель на перегруженный оператор? #5
alex_x_x, я не особо въехал. Можете подробнее примеры дать или годную литературу?
Yandex
Объявления
24.02.2014, 17:17     Можно ли передать в функцию указатель на перегруженный оператор?
Ответ Создать тему
Опции темы

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