[Rcpp-devel] wrapping a class having a method returning an object of class-type
James Simone
simone at fnal.gov
Thu May 31 16:42:28 CEST 2012
I have a C++ class that has a "clone" method which returns a distinct copy of the object.
I want to expose the clone method in R and my question is how this is best done using Rcpp?
My first attempt to expose "clone" results in a compile error since Rcpp cannot automatically handle
the returned object. Consider an example,
class Cnorm
{
public:
Cnorm() : z(0) {}
Cnorm(double z_) : z(z_) {}
double operator()( double x, double y ) const { return sqrt( x*x + y*y + z*z ); }
Cnorm clone() const { return Cnorm(z); }
private:
double z;
};
RCPP_MODULE(mod) {
using namespace Rcpp;
class_<Cnorm>("Cnorm")
.constructor<double>("constructor")
.method("clone",&norm::clone,"clone this object")
.method("norm",&Cnorm::operator(),"take the norm");
}
I found a solution which seems to work which involves adding
a free function. I have two questions, however,
1) Is the workaround below reasonable/best?
2) Does Rcpp properly take ownership of the new'ed Cnorm object?
SEXP cloner(Cnorm* self) {
Cnorm* cpy = new Cnorm;
*cpy = self->clone();
return Rcpp::internal::make_new_object(cpy);
}
RCPP_MODULE(mod) {
using namespace Rcpp;
class_<Cnorm>("Cnorm")
.constructor<double>("constructor")
.method("clone",&cloner,"clone this object")
.method("norm",&Cnorm::operator(),"take the norm");
}
More information about the Rcpp-devel
mailing list