我不認爲這是目前可能的,除非你能以某種方式實現一個具有(公共)默認構造函數的Singleton類。我將用下面的例子來證明 - 其中第二類是進行仔細的檢查,以確保該問題是不特定的靜態對象:
#include <Rcpp.h>
class Singleton {
public:
static Singleton& get() {
static Singleton s;
return s;
}
void method() const {
Rcpp::Rcout << "...\n";
}
private:
Singleton() {};
Singleton(const Singleton&);
void operator=(const Singleton&);
};
class NonStatic {
public:
void method() {
Rcpp::Rcout << "...\n";
}
private:
NonStatic() {}
NonStatic(const NonStatic&);
void operator=(const NonStatic&);
};
using namespace Rcpp;
RCPP_MODULE(Singleton) {
class_<Singleton>("Singleton")
.method("method", &Singleton::method)
;
class_<NonStatic>("NonStatic")
.method("method", &NonStatic::method)
;
}
與sourceCpp
編譯這一點,並試圖調用$method()
我的任何一堂課都會崩潰。如果您在* nix機器上,您可以通過從R --debugger=gdb
(或您選擇的調試器)的終端啓動R來調查此問題。
[email protected]:~/tmp$ R --debugger=gdb
## [omitted]
Reading symbols from /usr/lib/R/bin/exec/R...(no debugging symbols found)...done.
(gdb) R
## [omitted]
R> Rcpp::sourceCpp("singleton.cpp")
[Thread 0x7ffff13fd700 (LWP 18644) exited]
[Thread 0x7ffff3bfe700 (LWP 18643) exited]
[Thread 0x7ffff43ff700 (LWP 18642) exited]
R> ls()
[1] "NonStatic" "Singleton"
R> x <- new(Singleton)
R> x$method()
terminate called after throwing an instance of 'Rcpp::not_initialized'
what(): C++ object not initialized (missing default constructor?)
Program received signal SIGABRT, Aborted.
,同樣爲其他類:
R> Rcpp::sourceCpp("singleton.cpp")
[Thread 0x7ffff13fd700 (LWP 18737) exited]
[Thread 0x7ffff3bfe700 (LWP 18736) exited]
[Thread 0x7ffff43ff700 (LWP 18735) exited]
R> x <- new(NonStatic)
R> x$method()
terminate called after throwing an instance of 'Rcpp::not_initialized'
what(): C++ object not initialized (missing default constructor?)
Program received signal SIGABRT, Aborted.
只是稍微注意一下:它是模式,而不是範式:) – Incomputable
的[頁碼](http://dirk.eddelbuettel.com/code/ rcpp.html)表示,如果您使用Rcpp :: wrap,那麼您使用的類應該可以隱式轉換爲SEXP。但如果它使用tmp,那麼可能會出現編譯錯誤。如果這沒有幫助,那麼可能從外部(另一個構造函數參數,函數參數)或內部(受保護的成員)的變化導致錯誤。 – Incomputable
代碼會有幫助。 – hrbrmstr