Я нашел метод Enum wrap в boost.python
, но он не решил мои проблемы.
Пожалуйста, посмотрите код:
// wrap.h
#include "./caler.h"
#include "./order_side.h"
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(caler) {
class_<CALER>(
"CALER", init<std::string>())
.def("CalNetPnl", &CALER::CalNetPnl)
enum_<OrderSide::Enum>("OrderSide")
.value("Buy", OrderSide::Buy)
.value("Sell", OrderSide::Sell);
}
// all i want is to wrap OrderSide::Enum for python
// the function CalNetPnl uses OrderSide::Enum as its parmeter
// a.py
from caler import *
cl = CALER()
print(cl.CalNetPnl("ni1904", 100.0, 1, 99.0, OrderSide.Buy))
// Caler.cpp
double CALER::CalNetPnl(std::string ticker, float open_price, int open_size, float close_price, int close_size, OrderSide::Enum close_side) {
if (open_size != close_size) {
printf("opensize and closesize not equal %d %d\n", open_size, close_size);
open_size = close_size;
}
double gross_pnl = CalPnl(ticker, open_price, open_size, close_price, close_size, close_side);
Fee fee = CalFee(ticker, open_price, open_size, close_price, close_size);
double total_fee = fee.open_fee + fee.close_fee;
return gross_pnl - total_fee;
}
И сообщение об ошибке:
Boost.Python.ArgumentError: Python argument types in
CALER.CalNetPnl(CALER, str, float, int, float, int, OrderSide.Buy)
did not match C++ signature:
CalNetPnl(CALER {lvalue}, std::string, double, int, double, int, OrderSide::Enum)
Я думаю, что OrderSide.Buy
равно OrderSide::Buy
, сторона заказа - это структура OrderSide {Enum {Unknown, Buy, Sell}};Кто-нибудь может помочь?