2014-01-30 143 views
0

我正在嘗試瞭解Boost函數。我想將Python函數傳遞給使用Boost Python包裝的C++模塊。我遵循給定的例子here,並修改它以接受採用輸入參數並返回一些輸出的函數。這裏是我的代碼:將Python函數傳遞給Boost C++

typedef double (op_t)(double); 
boost::function<op_t> op; 

double defaultOperator(double t) { 
    return t; 
} 

void setOperator(boost::python::object obj) { 
    op = obj; 
} 

double callOperator(double t) { 
    return op(t); 
} 

BOOST_PYTHON_MODULE(op1) { 
    op = &defaultOperator; 

    def("setOperator", &setOperator); 
    def("callOperator", &callOperator); 
} 

當我嘗試編譯此,我在setOperator功能,說cannot convert ‘boost::python::api::object’ to ‘double’ in return得到一個錯誤。如果我用typedef void (op_t)(double);替換typedef行並將callOperator更改爲void,代碼將起作用。這允許我傳遞可以對參數進行操作但不返回任何內容的Python函數。

我的代碼有什麼問題?我應該如何糾正它傳遞一個返回值的Python函數?

回答

0

經過大量的搜索和一些試用&錯誤,我設法修改我的代碼,使其工作。我必須爲Boost Python對象創建一個包裝器結構,其中包含一個operator()方法,以便在將包裝對象分配給op變量之前,可以將其轉換爲Boost函數。下面是修改後的代碼:

struct op_wrapper_t { 

    op_wrapper_t(object callable) : _callable(callable) {} 

    double operator()(double t) { 
    return extract<double>(_callable(t)); 
    } 

    object _callable; 
}; 

void setOperator(object obj) { 
    op = boost::function<double (double)>(op_wrapper_t(obj)); 
} 

我遵循了類似的過程作爲一個在this post。然而,我仍然不明白爲什麼不返回void的函數不需要這樣的包裝器/鑄件。