2013-01-22 20 views
5

Nhóm của chúng tôi đang phát triển một khung số bằng cách sử dụng C++. Bây giờ, chúng ta có thể bao bọc các phần cơ bản của khung công tác để có sẵn trong Python. Vũ khí của chúng tôi là Boost.Python vì chúng tôi cũng đã tăng cường cho các mục đích khác. Chúng tôi chỉ sử dụng smart_ptrs để hỗ trợ đa hình. Đoạn sau đây là một ví dụ đơn giản về cách chúng tôi sẽ áp dụng mô hình chiến lược:Sử dụng shared_ptr thành cơ sở trừu tượng với tư cách là người nắm giữ với boost.python

#include <boost/shared_ptr.hpp> 
struct AbsStrategy 
{ 
    virtual std::string talk() = 0; 
}; 

typedef boost::shared_ptr<AbsStrategy> StrategyPtr; 

struct Foo : AbsStrategy 
{ 
    std::string talk() 
    { 
    return "I am a Foo!"; 
    } 
}; 

struct Bar : AbsStrategy 
{ 
    std::string talk() 
    { 
    return "I am a Bar!"; 
    } 
}; 

struct Client 
{ 
    Client(StrategyPtr strategy) : 
      myStrategy(strategy) 
    { 
    } 

    bool checkStrategy(StrategyPtr strategy) 
    { 
    return (strategy == myStrategy); 
    } 

    StrategyPtr myStrategy; 
}; 

Nếu tôi quấn toàn bộ điều sử dụng Boost.Python như vậy

#include <boost/python.hpp> 
using namespace boost::python; 

BOOST_PYTHON_MODULE(BoostPython) 
{ 
    class_<Foo>("Foo") 
     .def("talk", &Foo::talk); 

    class_<Bar>("Bar") 
     .def("talk", &Bar::talk); 

    class_<Client>("Client", init<StrategyPtr>()) 
     .def("checkStrategy", &Client::checkStrategy); 
} 

cảnh báo sau bật lên trong biên soạn

C:/boost/include/boost-1_51/boost/python/object/instance.hpp:14:36: warning: type attributes ignored after type is already defined [-Wattributes] 

Khi tôi cố gắng sử dụng giấy gói trong python, tôi nhận được lỗi sau

>>> from BoostPython import * 
>>> foo = Foo() 
>>> bar = Bar() 
>>> client = Client(foo) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
Boost.Python.ArgumentError: Python argument types in 
    Tree.__init__(Tree, Foo) 
did not match C++ signature: 
    __init__(_object*, boost::shared_ptr<AbsStrategy>) 
>>> client = Client(bar) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
Boost.Python.ArgumentError: Python argument types in 
    Tree.__init__(Tree, Bar) 
did not match C++ signature: 
    __init__(_object*, boost::shared_ptr<AbsStrategy>) 

Điều gì còn thiếu để làm cho toàn bộ công việc hoạt động mà không thay đổi khuôn khổ của chúng ta? Các trình bao bọc có thể được điều chỉnh tự do tất nhiên.

+0

Nếu bạn không nhận được một câu trả lời ở đây, hãy thử các Boost.Python danh sách, gmane.comp.python.c gửi thư ++. – user763305

Trả lời

4

Ok tôi đã tìm được giải pháp. Người ta phải sử dụng implicitly_convertible trong khai báo mô-đun như hình dưới đây.

#include <boost/python.hpp> 
using namespace boost::python; 

BOOST_PYTHON_MODULE(BoostPython) 
{ 
    class_<Foo>("Foo") 
     .def("talk", &Foo::talk); 

    class_<Bar>("Bar") 
     .def("talk", &Bar::talk); 

    class_<Client>("Client", init<StrategyPtr>()) 
     .def("checkStrategy", &Client::checkStrategy); 

    implicitly_convertible<boost::shared_ptr<Foo> , StrategyPtr>(); 
    implicitly_convertible<boost::shared_ptr<Bar> , StrategyPtr>(); 
} 
Các vấn đề liên quan