[Rcpp-devel] How to Get Pointer of Underlying Object of Rcpp Module Class
Tianqi Chen
tianqi.tchen at gmail.com
Tue Oct 6 23:40:36 CEST 2015
Dear Rcpp Developers:
```c++
class MyClass {
public:
static void SaveList(SEXP list, const std::string& filename) {
Rcpp::List data_lst(list);
std::vector<MyClass *> internals(data_lst[i]);
for (size_t i = 0; i < data_lst.size(); ++i) {
SEXP obj = data_lst[i];
// Need to Get internal pointers from S4 MyClass object
internals[i] = GetPtr<MyClass>(obj);
}
SomeRealSave(internals, filename);
}
static void LoadList(const std::string& filename) {
std::vector<MyClass > internals;
SomeReadLoad(&internals);
Rcpp::List out(internals.size());
for (size_t i = 0; i < internals.size(); ++i) {
// need to construct a MyClass object from C++ side
out[i] = MyClassConstructor(internals[i]);
}
return out;
}
};
RCPP_MODULE(MyClass) {
class_<MyClass>("MyClass");
function("save.myclass.list", &MyClass::SaveList);
function("load.myclass.list", &MyClass::LoadList);
}
```
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.
So the question is how is there any solution to GetPtr<MyClass> and
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.
What was wanted is indeed possible if we choose to only expose
XPtr<MyClass>, so we can simply do
```
MyClass * GetPtr<MyClass>(SEXP obj) {
XPtr<MyClass>(obj).get();
}
MyClassConstructor(MyClass *ptr) {
return XPtr<MyClass>(ptr);
}
```
But it would be really nice we can directly return a wrapped S4 object
instead of raw ptr
Tianqi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20151006/364a8dbf/attachment.html>
More information about the Rcpp-devel
mailing list