[Rcpp-devel] using Rcpp modules to expose class

Robin Girard robin.girard at mines-paristech.fr
Mon May 13 19:05:47 CEST 2013


As suggested in the example of Romain's Blog 
here http://romainfrancois.blog.free.fr/
you need to define the class before "exposing" it and then implement it (I think it is also important that using namespace Rcpp  comes after the exposed stuff). 

class Foo ;
RCPP_EXPOSED_CLASS(Foo)

using namespace Rcpp ;

class Foo{
    public:
        enum Bla{ FOO, BAR } ;
... 


is it what you did ? 
I made it work in some cases and I did not have to implement the wrap (which is the whole purpose of module I think). 
R.

----- Mail original -----
De: "Anwar Ludin" <anwar.ludin at riskcetera.com>
À: "Dirk Eddelbuettel" <edd at debian.org>
Cc: rcpp-devel at lists.r-forge.r-project.org
Envoyé: Lundi 13 Mai 2013 16:11:35
Objet: Re: [Rcpp-devel] using Rcpp modules to expose class

Hi Dirk,

Thanks for your answer!

So if I understand correctly, the fact that I exposed previously 
Portfolio is not enough?
I still need to provide wrap the template specialization:

     template <> SEXP wrap( const Portfolio& ) ;

Thanks,

Anwar

On 05/13/2013 03:28 PM, Dirk Eddelbuettel wrote:
> On 13 May 2013 at 14:59, Anwar Ludin wrote:
> | Hello,
> |
> | I'm trying to expose 2 classes from a Rcpp module:
> |
> | class Portfolio{
> |   private:
> |      std::string portfolioId, description;
> |   public:
> |       Portfolio(std::string portfolioId, std::string description)
> |       : portfolioId(portfolioId), description(description) {}
> |
> |       std::string getPortfolioId() {return portfolioId;} const
> |       void setPortfolioId(const std::string&) {this->portfolioId =
> | portfolioId;}
> |
> |       std::string getDescription() {return description;} const
> |       void setDescription(const std::string& description){this->description =
> | description;}
> | };
> |
> | class PortfolioDataAccess{
> |     private:
> |     mongo::DBClientConnection c;
> |
> |     public:
> |     PortfolioDataAccess();
> |     virtual Portfolio read(std::string portfolioId);
> |     virtual void create(std::string portfolioId, std::string description);
> |
> |   };
> |
> |
> |
> |
> | RCPP_MODULE(riskceteraPortfolio) {
> |   class_<riskcetera::Portfolio>( "Portfolio" )
> |   .constructor<std::string, std::string>()
>
> That works because we can convert "in" from SEXP to std::strings.
>
> |   .method("id", &riskcetera::Portfolio::getPortfolioId)
> |   .method("description", &riskcetera::Portfolio::getDescription)
> |   ;
> |
> | class_<riskcetera::PortfolioDataAccess>("PortfolioAccess")
> |   .constructor()
> |   .method("read", &riskcetera::PortfolioDataAccess::read)
> |   ;
> | }
> |
> | When trying to compile the module I get the following error:
> |
> |
> | /riskcetera/home/aludin/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include/Rcpp/internal/wrap.h:474:7: error: no viable conversion from 'const riskcetera::Portfolio' to 'SEXP' (aka 'SEXPREC *')
> |         SEXP x = object ;
>
> That is pretty plain:  You need to supply a wrap() converter that tells the
> compiler how to turn one of your objects ("Portfolio") into R's standard
> type, the SEXP.
>
> The currently-on-CRAN version of RcpBDT may help you.  It does something
> pretty simply with Boost Date_Time, converting dates between the Boost
> representation and the Rcpp / R representation.  It uses custom as<>() and
> wrap(), and exposes a handful of useful functions too.   [ And do look at the
> CRAN version, the R-Forge version is in heavier development which I started
> last fall and hope to get back to by the summer. ]
>   
> Dirk
>


_______________________________________________
Rcpp-devel mailing list
Rcpp-devel at lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel


More information about the Rcpp-devel mailing list