[Rcpp-devel] Wrapping a c++ class with singleton using RCPP Module

Matthew Supernaw - NOAA Federal matthew.supernaw at noaa.gov
Wed Feb 21 16:47:51 CET 2024


Hi Nikhil,
I'm not exactly sure what you are trying to do, but I hope this simple
example is helpful.
Thanks.
Matthew


#include <Rcpp.h>
using namespace Rcpp;


class Foo{
public:
  static Foo* singleton;

  Foo(){
  }

  void SayHello(){
    Rcpp::Rcout << "From \"void SayHello()\" -> "<<this<<" -> ";
    Rcpp::Rcout << "hello from Foo.\n";
  }

  static Foo* GetSingleton(){

    if(singleton == NULL){
      Foo::singleton = new Foo();
    }
    Rcpp::Rcout<<"From \"static Foo* GetSingleton()\" -> memory address for
singleton is " <<Foo::singleton<<"\n";
    return Foo::singleton;
  }
};

Foo* Foo::singleton = NULL;

RCPP_EXPOSED_CLASS(Foo)

  Foo& GetSingleton(){
    Foo* foo_singleton = Foo::GetSingleton();
    Rcpp::Rcout<<"From \"Foo& GetSingleton()\" -> memory address for
singleton is " <<foo_singleton<<"\n";
    return *foo_singleton;
  }

RCPP_MODULE(foo) {
  Rcpp::class_<Foo>("Foo")
  .constructor()
  .method("SayHello", &Foo::SayHello);
  Rcpp::function("GetSingleton", &GetSingleton);

}
//From R
// library(singleton)
// library(Rcpp)
//
// foo <- Rcpp::Module("foo", PACKAGE = "singleton")
//
// foo_singleton<-foo$GetSingleton()
// foo_singleton$SayHello()

// Output:
// From "static Foo* GetSingleton()" -> memory address for singleton is
0x7fcdf9387590
// From "Foo& GetSingleton()" -> memory address for singleton is
0x7fcdf9387590
// From "void SayHello()" -> 0x7fcdf9392b60 -> hello from Foo.

On Wed, Feb 21, 2024 at 1:34 AM Nikhil Garg <nikhilgarg.gju at gmail.com>
wrote:

> Hi,
>
> I am looking for some advice or hoping someone can point me in the right
> direction for wrapping a C++ class with singleton using Rcpp. I have been
> using RCPP modules for some of this work but got stuck with a C++ object
> which returns a singleton.
>
> Here is the general structure of the object
>
> class Foo {
>     public:
>         Foo();
>         ~Foo();
>
>         static Foo &getFoo();
>         Foo(Foo const&) = delete;
>         void operator=(Foo const&) = delete;
> }
>
> Regards,
> Nikhil
> _______________________________________________
> 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
>


-- 
Matthew Supernaw
*Scientific Software Developer*
*National Oceanic and Atmospheric Administration*
*Office Of Science and Technology*
*NOAA Fisheries | *U.S. Department of Commerce
Phone 248 - 396 - 7797
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20240221/c9c8b2d5/attachment.htm>


More information about the Rcpp-devel mailing list