Now, for Rcpp classes to be aware of a custom wrap, you need some
gymnatics, as described in the Rcpp-extending vignette.
You need to include RcppCommon.h first, define you class and declare the
custom wrap, then include Rcpp.h, then define you wrap.
I'm pasting a full pass at it below.
Thanks a lot for your help!

Things will get much simpler when we figure out a way to return classes
exposed by modules and implement it.
I am looking forward to that :-).

Peter



require( inline )
require( Rcpp )

settings <- getPlugin("Rcpp")
settings$includes <- sprintf( "%s\n%s",
'
#include <RcppCommon.h>
// B just stores an integer i here
class B {
public:
B(int i) : i(i) {}

int get_i() const {
return i;
}

private:
int i;
} ;
namespace Rcpp{
template <>
SEXP wrap( const B& object ) ;
}
',
settings$includes
)

inc <- '
namespace Rcpp {
template <>
SEXP wrap( const B& object ){
Language call( "new", Symbol( "B" ), object.get_i() ) ;
return call.eval() ;
}
}

// A contains a vector v of pointers to B
class A {
public:
A(int n) : v(n) {}

// THIS IS THE METHOD I WOULD LIKE TO IMPLEMENT:
SEXP foo(int j) {
if (!v[j]) {
v[j] = new B(j);
}

// THIS DOES NOT WORK:
return wrap(*v[j]);
}

private:
std::vector<B*> v;
} ;

// Rcpp module exposing both A and B
RCPP_MODULE(MyModule) {
class_<A>( "A" )
.constructor<int>(
"Create an instance of A with a given number of pointers")
.method("foo",
&A::foo,
"(Create and) get one of the objects of type B.")
;

class_<B>( "B" )
.constructor<int>("Create an instance of B from an int.")
.property("i",
&B::get_i)
;
}
'

fx <- cxxfunction( , '

', includes = inc, settings = settings )
populate( Module( "MyModule", getDynLib( fx ) ), env = .GlobalEnv )

a <- new (A, 5)
b <- a$foo(0)
b$i
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to