Указатели на функции
От: Аноним  
Дата: 05.10.04 06:09
Оценка:
Надо в одну коллекцию собрать указатели на различные однотипные функции, определённые в разных классах. Оцните такой вариант
class AbstractFunction {
public:
    virtual float operator() (int) = 0;
};

template<class T>
class Function : public AbstractFunction {
public:
    typedef float (T::*PFN_METHOD)(int);

    Function(T* obj, PFN_METHOD pfn) : _obj(obj), _pfn(pfn) {}

    virtual float operator() (int k) { 
        return (_obj->*_pfn)(k); 
    }

protected:
    T*         _obj;
    PFN_METHOD _pfn;
};


Для использования что — то типа

//////////////////////////////// 
class Test1 {
public:
    float fn1(int k) {
        return 2*k;
    }
};

class Test2 {
public:
    float fn2(int k) {
        return k+100;
    }
};

/////////////////////////////////

void use() {
    AbstractFunction *func[2];
    Test1 t1;
    Test2 t2;

        // заполнение
    func[0] = new Function<Test1>(&t1, Test1::fn1);
    func[1] = new Function<Test2>(&t2, Test2::fn2);

    AbstractFunction *f=func[0];

         // вызов
    float r = (*f)(1);

    delete func[0];
    delete func[1];
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.