[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