2016-11-18 6 views
0

У меня есть 2 функции с одинаковыми входными и выходными типами.Функция указателя на функцию из класса или автономной функции

uint32_t doWork(uint32_t time); 
uint32_t MyClass::DoWork(uint32_t time); 

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

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

Есть ли способ сохранить обе функции в одном и том же имени указателя функции и передать его конструктору?

Функция класса не является статической.

Любая помощь приветствуется!

+0

Если вы используете члена класса, как он должен знать, к какому объекту действовать? – Barmar

+0

related/dupe: http://stackoverflow.com/questions/30605393/assign-a-member-function-to-a-function-pointer – NathanOliver

+0

Будет ли повышенный уровень косвенности? – WhiZTiM

ответ

2

Я немного экспериментировал с моим компилятором на C++. Вот что я получил, что, кажется, делают работу:

#include <stdio.h> 

typedef unsigned int uint32_t; 

typedef uint32_t (doWorkPtr) (uint32_t time); 

uint32_t doWork(uint32_t time) { 
    return time*2; 
} 

class MyClass { 
    public: 
    int times; 
    int DoWork(uint32_t time) { return time*times; } 
}; 

struct Adapter { 
    MyClass* a; 
    doWorkPtr* ptr; 
    int operator() (uint32_t time) { 
    if(a) 
     return a->DoWork(time); 
    else 
     return ptr(time); 
    } 
}; 

int main(int argc, char** argv) { 
    Adapter* pointers[2]; 

    MyClass klass; 
    klass.times = 3; 
    Adapter adapter; 
    adapter.a = &klass; 
    adapter.ptr = 0; 

    Adapter adapter2; 
    adapter2.a = 0; 
    adapter2.ptr = &doWork; 

    pointers[0] = &adapter; 
    pointers[1] = &adapter2; 

    printf("result1 %i\n", (*pointers[0])(1)); 
    printf("result2 %i\n", (*pointers[1])(1)); 

    return 0; 
} 

Ваш класс будет хранить указатели «адаптер» вместо простых функций указателей при использовании этого.

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^