[Rcpp-devel] Passing template class as argument in Rcpp function
Subhomoy Ghosh
subhomoy25 at gmail.com
Fri Mar 5 17:14:57 CET 2021
Thanks, Iñaki! Your package gave me enough hints to create the following
attempt which seemed to have worked.
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;
// [[Rcpp::depends(RcppArmadillo)]]
class Distribution {
public:
virtual Distribution* clone() {return (new Distribution(*this));}
virtual ~Distribution() {}
};
template <typename T>
class Uniform : public Distribution {
public:
virtual Uniform<T>* clone() {return (new Uniform<T>(*this));}
Uniform(const T &max,int i_) :
max(max), i(i_) {}
~Uniform(){};
T max;
int i;
};
// [[Rcpp::export]]
XPtr<Distribution> getUniformParam( SEXP max,int i,int type) {
// create pointer to an Uniform object and
// wrap it as an external pointer for base class
if(type==1) {
return Rcpp::XPtr<Distribution> (new
Uniform<double>(as<double>(max), i) );
} else if(type==2) {
return Rcpp::XPtr<Distribution> (new Uniform<int>(as<int>(max),
i) );
}
// return the external pointer to the R side
return Rcpp::XPtr<Distribution>(R_NilValue);
}
// [[Rcpp::export]]
double test2(double z, XPtr<Distribution> xp, int type) {
Distribution* d=xp->clone();
double tt=1;
// convert the base pointer to derived class pointer
if(type==1){
Uniform<double> *f = dynamic_cast<Uniform<double> *>(d);
tt = z * f->max;
} else if (type==2){
Uniform<int> *f = dynamic_cast<Uniform<int> *>(d);
tt =z * f->max;
}
return tt;
}
// R side
xp<- getUniformParam(2.3,2,1)
test2(2,xp,1)
On Thu, Mar 4, 2021 at 2:58 PM Iñaki Ucar <iucar at fedoraproject.org> wrote:
> On Thu, 4 Mar 2021 at 20:31, Subhomoy Ghosh <subhomoy25 at gmail.com> wrote:
> >
> > Thanks, for the solution. I tried what you suggested and it shows "no
> matching constructor for initialization of 'Rcpp::XPtr<Distribution>'".
> Below here is my attempt:
> >
> > class Distribution {
> >
> > public:
> > template <typename T>
> > class Uniform2 {
>
> This is a nested class, which makes little sense in this context.
> Uniform2 should *inherit* from Distribution. Again, see my package as
> an example, which does exactly what you want.
>
> --
> Iñaki Úcar
>
--
Subhomoy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20210305/80e73789/attachment.html>
More information about the Rcpp-devel
mailing list