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