[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