【问题标题】:Using Rcpp to expose a constructor that takes a pointer to an object as a parameter使用 Rcpp 公开构造函数,该构造函数将指向对象的指针作为参数
【发布时间】:2020-05-19 18:31:00
【问题描述】:

我有以下非常简单的代码,它定义了一个 B 类,该 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>()
    ;
}

【问题讨论】:

  • 我已经考虑了一段时间,但您确定我们允许以这种方式继承吗?我认为大多数 Rcpp 模块使用更简单,并且只做一层(可能像我在 Rcpp Annoy 中那样进行模板化)。
  • @DirkEddelbuettel:我还没有见过这样的 Rcpp 示例,但这是对象的常见用法。例如,A 可以是一个城市,B 可以是一个人。然后可以问诸如“此人居住的城市的温度是多少?”之类的问题。 B 不是从 A 继承的,只是有一个指向 A 的指针。

标签: c++ oop rcpp


【解决方案1】:

让我们试着固执一点:B 的构造函数期望引用 A,因此我们应该将其公开,即 .constructor&lt;A&amp;&gt;()。这样做我得到错误

invalid user-defined conversion from ‘SEXP’ {aka ‘SEXPREC*’} to ‘A&amp;’

基本上我们想要创建可在 R 中调用的东西(B 的构造函数),但我们只能使用 SEXP 作为参数的类型。目前尚不清楚如何在SEXPA&amp; 之间进行转换。这种转换将是 Rcpp::as 的任务(以及相反的 Rcpp::wrap),这在 Rcpp 扩展小插图中有所介绍。对于 Rcpp 模块,我们可以使用RCPP_EXPOSED_AS 和朋友提供的快捷方式,c.f. Rcpp-modules 小插图中的第 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

【讨论】:

  • 不错。 Rcpp Gallery 撰写文章以保存它/给它更多曝光?
  • @Dirk。我才意识到我之前写过好几次关于RCPP_EXPOSED_* 的文章。为画廊写下这些是有道理的。让我们看看能不能找到一些激励人心的例子……
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多