Boost.Python教实现分析:instance_holder.hpp

26 篇文章 0 订阅

<boost/python/instance_holder.hpp> 提供了类instance_holder ,它是包含包装类的C ++实例的类型的基类。

Class template instance_holder

Class intance_holder 析构

Class intance_holder 修饰符

Class intance_holder 观察者

instance_holder 是一个抽象基类,其具体派生类在其Python对象包装器中保存C ++类实例。 为了允许C ++类包装器在Python中进行多重继承,每个这样的Python对象都包含一个instance_holders链。 当调用包装的C ++类的__init__函数时,将使用其install ()函数创建一个新的instance_holder实例并将其安装在Python对象中。 从instance_holder派生的每个具体类必须提供一个holds ()实现,它允许Boost.Python查询它所持有的类型。 为了支持保持类型的包装构造函数,该类还必须提供构造函数,这些构造函数可以接受引用拥有的Python对象的初始PyObject *参数,并将其余参数转发给保持类型的构造函数。 需要初始参数才能在Python中启用虚函数覆盖,并且可能会被忽略,具体取决于特定的instance_holder子类。

namespace boost { namespace python
{
  class instance_holder : noncopyable
  {
   public:
      // destructor
      virtual ~instance_holder();

      // instance_holder modifiers
      void install(PyObject* inst) throw();

      // instance_holder observers
      virtual void* holds(type_info) = 0;
  };
}}

 析构函数

virtual ~instance_holder();

作用

销毁对象实体

修饰符

void install(PyObject* inst) throw();

条件

inst是包装的C ++类类型的Python实例,或者是从包装的C ++类类型派生的类型。

作用

将新实例安装在Python对象的持有实例链的头部。

异常

没有

观察者

virtual void *holds(type_info x) = 0;

返回

指向由x描述的类型的对象的指针,如果* this包含这样的对象,否则为0。

 

以下是Boost.Python用于包装智能指针所包含的类的实例持有者模板的简化版本:

template <class SmartPtr, class Value>
struct pointer_holder : instance_holder
{
   // construct from the SmartPtr type
   pointer_holder(SmartPtr p)
       :m_p(p)

   // Forwarding constructors for the held type
   pointer_holder(PyObject*)
       :m_p(new Value())
   {
   }

   template<class A0>
   pointer_holder(PyObject*,A0 a0)
       :m_p(new Value(a0))
   {
   }

   template<class A0,class A1>
   pointer_holder(PyObject*,A0 a0,A1 a1)
       :m_p(new Value(a0,a1))
   {
   }
   ...

 private: // required holder implementation
   void* holds(type_info dst_t)
   {
       // holds an instance of the SmartPtr type...
       if (dst_t == python::type_id<SmartPtr>())
           return &this->m_p;

       // ...and an instance of the SmartPtr's element_type, if the
       // pointer is non-null
       return python::type_id<Value>() == dst_t ? &*this->m_p : 0;
   }

 private: // data members
   SmartPtr m_p;
};

 

您想要实现点击 RecyclerView 后跳转到一个新页面展示 RecyclerView 内的信息,这可以通过以下步骤实现: 1. 为 RecyclerView 中的每个 item 添加一个 onClickListener,监听点击事件。 2. 在 onClickListener 中获取被点击 item 的数据。 3. 将数据传递给新页面,用于展示。 4. 启动新页面,展示数据。 具体实现步骤如下: 1. 在 RecyclerView 的 Adapter 中为 item 添加 onClickListener: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<MyData> mDataList; private Context mContext; public MyAdapter(List<MyData> dataList, Context context) { mDataList = dataList; mContext = context; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { MyData data = mDataList.get(position); holder.bindData(data); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // item 被点击了 Intent intent = new Intent(mContext, DetailActivity.class); intent.putExtra("data", data); mContext.startActivity(intent); } }); } @Override public int getItemCount() { return mDataList.size(); } static class MyViewHolder extends RecyclerView.ViewHolder { private TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.text_view); } public void bindData(MyData data) { mTextView.setText(data.getText()); } } } ``` 2. 在新页面中获取传递的数据,并展示: ``` public class DetailActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); mTextView = findViewById(R.id.text_view); MyData data = getIntent().getParcelableExtra("data"); mTextView.setText(data.getText()); } } ``` 需要注意的是,MyData 类需要实现 Parcelable 接口,以便可以将数据传递给新页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值