[Rcpp-devel] using Rcpp modules to expose class
Anwar Ludin
anwar.ludin at riskcetera.com
Mon May 13 16:11:35 CEST 2013
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
>
More information about the Rcpp-devel
mailing list