Как заставить член класса вести себя как указатель на функцию, используя Boost
Я хотел бы, чтобы функция-член класса вела себя как указатель на функцию. Мне нужно это поведение, чтобы интегрировать мои собственные классы в некоторый существующий код.
Кажется, что это может быть возможно с использованием Boost::function и Boost::bind, но я не могу заставить его работать. Следующий код является минимальным примером, который я использую для проверки своей реализации. Последняя строка в программе main() - это то, что я хотел бы сделать.
Любая помощь с благодарностью. Я использую g++ и Boost 1.46.
// Includes
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <stdio.h>
using namespace std;
// Define a pure virtual base class
class Base{
public:
virtual double value(double v, double t) = 0;
};
// Define a derived class
class Derived : public Base{
public:
double value(double v, double t){
return v*t;
}
};
// Main program
int main(){
// A derived class
boost::shared_ptr<Derived> p(new Derived);
// Use class directly
printf("value = %f\n", p->value(100, 1));
// Create a boost::function
boost::function< double (Derived*, double, double) > f;
f = &Derived::value;
printf("f(&A, 100, 2) = %f\n", f(p.get(), 100, 2));
// Use boost::bind
printf("bind f(100,3) = %f\n", boost::bind(&Derived::value, p, _1, _2)(100,3));
// Make a boost::function to the binded operation???
boost::function< double (double, double) > f2;
f2 = boost::bind(&Derived::value, p.get()); // This is wrong
printf("f2(100,4) = %f\n", f2(100,4)); // I want to be able to do this!
}
1 ответ
Решение
На основании документации (см. Раздел "Использование привязки с указателями на элементы") необходимо указать, что функция имеет два параметра:
f2=bind(&Derived::value, p.get(), _1, _2);
f2(100, 4); // p.get()->value(100, 4)