2012-05-16 35 views
0

我想有一個類成員函數的行爲就像一個函數指針。我需要這種行爲來將我自己的類集成到一些現有的代碼中。如何讓類成員的行爲像一個函數指針使用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! 
} 

回答

0

基礎上documentation(見「的指針使用綁定到成員」),您需要指定該函數有兩個參數:

f2=bind(&Derived::value, p.get(), _1, _2); 
f2(100, 4); // p.get()->value(100, 4) 
+0

這工作,我以爲我試過了,但我想不是。謝謝你給它一個新的眼睛。 – slaughter98