Le 6 mai 2014 à 08:45, Florian Burkart <florian.burk...@gmail.com> a écrit :
> Hi everyone (and Dirk), > > Second attempt on corrected email list. > > I have been trying to extend Rcpp with my own wrap and as templates. > > Two issues: > > 1) I need to explicitly call wrap. Is that expected? > > So for example I wrote this specialization: This is not a specialization, just another overload. You need to write a specialization, as in: namespace Rcpp{ template<> SEXP wrap<std::vector< TimedOptDouble > > (std::vector<TimedOptDouble> const& entries) { … } } > template<> SEXP Rcpp::wrap(std::vector<TimedOptDouble> const& entries) { > std::vector<double> sec_times; > std::vector<double> doubles; > for(auto const& entry : entries) > { > sec_times.push_back(entry.GetTime().Seconds()); > TimedOptDouble::OptDouble opt_double(entry.GetOptDouble()); > if(opt_double) > doubles.push_back(*opt_double); > else > doubles.push_back(R_NaReal); > } > return List::create( > Named( "Time" ) = sec_times, > Named( "Value" ) = doubles); > } > > First of all, this returns what I believe to be a Rcpp::List object, which > seems to be converted implicitly to a SEXP. This is the typical behaviour I > know. > > Unfortunately, when making use of this template, it doesn't work implicitly, > but I need to explicitly call it. > > So for example > > SEXP GetSunPositions(SEXP a) { > std::vector<TimedOptDouble> sun_positions; > ... > return wrap(sun_positions); > } > > works, where as > > return sun_positions; > > as last line doesn't. Am I doing something wrong here? I did do the > declaration before including <Rcpp.h>. This should work if you return a std::vector< TimedOptDouble > from your function, as in: std::vector< TimedOptDouble > GetSunPositions(SEXP a) { … } > 2) How to make as work for own types in containers > > The other way around, one can return a std::vector<double> implicitly, but > how do I return std::vector<MyType>? I tried to define > > template<> MyType as(SEXP); > > But that didn't help, e.g. I had to write my own > > template<> std::vector<MyType> as(SEXP); This is the easiest way. A more general way would need you to express how to handle containers of MyType, but that requires defining some traits classes etc … not sure it is worth the effort. But again, you’d need to actually write a specialization: template<> std::vector<MyType> as< std::vector<MyType> > (SEXP); Romain > Thanks for help > > Florian > _______________________________________________ > 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
_______________________________________________ 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