使用 Rcpp 公开一个构造函数,该构造函数将指向对象的指针作为参数
Using Rcpp to expose a constructor that takes a pointer to an object as a parameter
我有以下非常简单的代码,它定义了一个 class B,它将一个指向 class A 的对象的指针作为参数。
如果我将其编译为独立的 C++,代码将完美运行,但我无法使用 Rcpp 公开 class 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 中调用的东西(B
的构造函数),但我们只能使用 SEXP
作为参数的类型。目前还不知道如何在SEXP
和A&
之间进行转换。这种转换将是 Rcpp::as
的任务(而 Rcpp::wrap
则相反),这在 Rcpp-extending vignette 中有所介绍。对于 Rcpp 模块,我们可以使用 RCPP_EXPOSED_AS
和朋友 c.f 提供的快捷方式。 Rcpp 模块小插图中的第 2.2.11 节。
这里是添加了验证码的完整示例:
#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
我有以下非常简单的代码,它定义了一个 class B,它将一个指向 class A 的对象的指针作为参数。
如果我将其编译为独立的 C++,代码将完美运行,但我无法使用 Rcpp 公开 class 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 中调用的东西(B
的构造函数),但我们只能使用 SEXP
作为参数的类型。目前还不知道如何在SEXP
和A&
之间进行转换。这种转换将是 Rcpp::as
的任务(而 Rcpp::wrap
则相反),这在 Rcpp-extending vignette 中有所介绍。对于 Rcpp 模块,我们可以使用 RCPP_EXPOSED_AS
和朋友 c.f 提供的快捷方式。 Rcpp 模块小插图中的第 2.2.11 节。
这里是添加了验证码的完整示例:
#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