<div dir="ltr"><div style="font-size:12.8px">Dear Rcpp Developers:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">```c++</div><div style="font-size:12.8px">class MyClass {</div><div style="font-size:12.8px">public:</div><div style="font-size:12.8px">  Â static void SaveList(SEXP list, const std::string& filename) {</div><div style="font-size:12.8px">  Â  Â  Â  Â Â Rcpp::List data_lst(list);</div><div style="font-size:12.8px">  Â  Â  Â  Â  std::vector<MyClass *> internals(data_lst[i]);</div><div style="font-size:12.8px">  Â  Â  Â  Â  for (size_t i = 0; i < data_lst.size(); ++i) {</div><div style="font-size:12.8px">  Â  Â  Â  Â  Â  Â  Â SEXP obj = data_lst[i];</div><div style="font-size:12.8px">  Â  Â  Â  Â  Â  Â  Â // Need to Get internal pointers from S4 MyClass object</div><div style="font-size:12.8px">  Â  Â  Â  Â  Â  Â  Â internals[i] = GetPtr<MyClass>(obj);</div><div style="font-size:12.8px">  Â  Â  Â  Â  }</div><div style="font-size:12.8px">  Â  Â  Â  Â  SomeRealSave(internals, filename);</div><div style="font-size:12.8px">  Â }</div><div style="font-size:12.8px">  Â static void LoadList(const std::string& filename) {</div><div style="font-size:12.8px">  Â  Â  Â  Â  std::vector<MyClass > internals;</div><div style="font-size:12.8px">  Â  Â  Â  Â  SomeReadLoad(&internals);</div><div style="font-size:12.8px">  Â  Â  Â  Â Â Rcpp::List out(internals.size());</div><div style="font-size:12.8px">  Â  Â  Â  Â  for (size_t i = 0; i < internals.size(); ++i) {</div><div style="font-size:12.8px">  Â  Â  Â  Â  Â  Â  // need to construct a MyClass object from C++ side</div><div style="font-size:12.8px">  Â  Â  Â  Â  Â  Â  out[i] = MyClassConstructor(internals[i]);</div><div style="font-size:12.8px">  Â  Â  Â  Â  }</div><div style="font-size:12.8px">  Â  Â  Â  Â return out;</div><div style="font-size:12.8px">  Â }</div><div style="font-size:12.8px">};</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">RCPP_MODULE(MyClass) {</div><div style="font-size:12.8px">  Â  Â class_<MyClass>("MyClass");</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">  Â  Â function("save.myclass.list", &<span style="font-size:12.8px">MyClass</span>::SaveList);</div><div style="font-size:12.8px">  Â  Â function("load.myclass.list", &<span style="font-size:12.8px">MyClass</span>::LoadList);</div><div style="font-size:12.8px">}</div><div style="font-size:12.8px">```</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><span style="font-size:12.8px">To be specific, We have ways to Save/Load the pointers to the MyClass object (in the SomeRealSave and SomeRealLoad). In our specific use-case, It was an Array on GPU.</span></div><div style="font-size:12.8px"><br><div style="font-size:12.8px">So the question is how is there any solution to <span style="font-size:12.8px"> </span><span style="font-size:12.8px">GetPtr<MyClass> and </span><span style="font-size:12.8px">MyClassConstructor, so we can get the internal pointer of MyClass from SEXP(which is the S4 object), and construct the corresponding S4 object given the information of MyClass.</span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">What was wanted is indeed possible if we choose to only expose XPtr<MyClass>, so we can simply do </span></div><div style="font-size:12.8px"><span style="font-size:12.8px">```</span></div><div style="font-size:12.8px"><span style="font-size:12.8px">  Â  MyClass * GetPtr<MyClass>(SEXP obj) {</span></div><div style="font-size:12.8px"><span style="font-size:12.8px">  Â  Â  Â  Â XPtr<MyClass>(obj).get();</span></div><div style="font-size:12.8px"><span style="font-size:12.8px">  Â  } </span><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">  Â Â </span><span style="font-size:12.8px">MyClassConstructor(MyClass *ptr) {</span></div><div style="font-size:12.8px"><span style="font-size:12.8px">  Â  Â  Â  return XPtr<MyClass>(ptr); </span></div><div style="font-size:12.8px"><span style="font-size:12.8px">  Â } </span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">```</span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">But it would be really nice we can directly return a wrapped S4 object instead of raw ptr</span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">Tianqi</span></div></div></div>