微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rcpp:如何使用展开保护?

如何解决Rcpp:如何使用展开保护?

我想知道如何让一些 Rcpp 代码所有 Rcpp 对象创建中使用自动展开保护。

例如,假设我有一些这样的代码

#include <stdint.h>
#include <Rcpp.h>

class MyObj {
public:
    int val;
    MyObj(int val) : val(val) {};
    ~MyObj() {
        std::cout << "I' being destructed - value was: " << val << std::endl;
    }
};

// [[Rcpp::export]]
Rcpp::NumericVector crashme(unsigned int seed)
{
    srand(seed);
    MyObj obj1(rand());
    Rcpp::NumericVector out(INT64_MAX-1,100.);
    return out;
}

当我调用 crashme 时,obj1 不会在函数结束之前被破坏,因为我想防止 R 的长跳转

我看到有一个函数 Rcpp::unwindProtect,但它被实现为需要回调的东西。

我不确定我是否做对了 100%,但我设法添加了这样的放松保护:

#include <stdint.h>
#include <Rcpp.h>
#include <Rcpp/unwindProtect.h>
// [[Rcpp::plugins(unwindProtect)]]

class MyObj {
public:
    int val;
    MyObj(int val) : val(val) {};
    ~MyObj() {
        std::cout << "I' being destructed - value was: " << val << std::endl;
    }
};

struct NumVecArgs {
    size_t size;
    double fillwith;
};

SEXP alloc_NumVec(void *data)
{
    NumVecArgs *args = (NumVecArgs*)data;
    return Rcpp::NumericVector(args->size,args->fillwith);
}

// [[Rcpp::export]]
Rcpp::NumericVector crashme(unsigned int seed)
{
    srand(seed);
    MyObj obj1(rand());
    NumVecArgs args = {INT64_MAX-1,100.};
    Rcpp::NumericVector out = Rcpp::unwindProtect(alloc_NumVec,(void*)&args);
    return out;
}

现在调用 crashme 将成功析构 obj1 并打印析构函数消息。

但这非常不方便,因为我有一系列不同的 Rcpp 对象分配采用不同的构造函数类型,这意味着要么为它们中的每一个定义不同的结构和回调,要么将所有调用转换为冗长的 lambda 函数

有什么方法可以自动对构造函数进行所有调用,例如Rcpp::NumericVectorRcpp::IntegerVector 有解除保护吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?