我有下面这段非常简单的代码,它定义了一个类B,它的参数是一个指向类A对象的指针。
如果我把它编译成独立的C++,这段代码就能完美地工作,但是我还不能用Rcpp暴露类B。 我一定是在这一行做错了什么 .constructor<A>()
接近尾声。 试过所有的&、*等组合,都没有效果。 试了很多小时,我很迷茫。 欢迎提供任何想法。
#include <Rcpp.h>
using namespace Rcpp;
class A {
public:
A(int val_) { val = val_; }
int val;
};
class B {
public:
B(A& ptr_) { ptr = &ptr_; }
int getval() { return (this->ptr->val); }
A *ptr;
};
RCPP_MODULE(module_cpp) {
using namespace Rcpp;
class_<A>("A")
.constructor<int>()
.field("val", &A::val)
;
class_<B>("B")
.constructor<A>()
;
}
让我们试着固执一点。你的构造函数 B
期待一个对 A
所以,我们应该把它揭露出来,即。.constructor<A&>()
. 这样做,我得到的错误是
invalid user-defined conversion from ‘SEXP’ {aka ‘SEXPREC*’} to ‘A&’
基本上,我们想在R中创建一些可被调用的东西(R中的 B
),但我们只能使用 SEXP
作为参数的类型。而目前还不知道如何在 SEXP
和 A&
. 这类转换的任务是 Rcpp::as
(和 Rcpp::wrap
反之),这些内容在Rcpp扩展小节中都有介绍。对于Rcpp模块,我们可以采用由 RCPP_EXPOSED_AS
and friends, c.f. section 2.2.11 in Rcpp-modules vignette.
这里有一个完整的例子,并添加了验证代码。
#include <Rcpp.h>
using namespace Rcpp;
class A {
public:
A(int val_) { val = val_; }
int val;
};
class B {
public:
B(A& ptr_) { ptr = &ptr_; }
int getval() { return (this->ptr->val); }
A *ptr;
};
RCPP_EXPOSED_AS(A);
RCPP_MODULE(module_cpp) {
using namespace Rcpp;
class_<A>("A")
.constructor<int>()
.field("val", &A::val)
;
class_<B>("B")
.constructor<A&>()
.method("getVal", &B::getval)
;
}
/***R
a <- new(A, 42)
b <- new(B, a)
b$getVal()
*/
输出:
> Rcpp::sourceCpp('61898230.cpp')
> a <- new(A, 42)
> b <- new(B, a)
> b$getVal()
[1] 42