创建std::shared_ptr对象并将其返回到R端(Rcpp) 我试图用RCPP写一个C++脚本的绑定。其中一个函数需要一个std::shared_ptr对象。我发现很难初始化std::shared_ptrobj并将其作为Rcpp::XPtr对象返回到R端
我试过(最少的例子):创建std::shared_ptr对象并将其返回到R端(Rcpp) 我试图用RCPP写一个C++脚本的绑定。其中一个函数需要一个std::shared_ptr对象。我发现很难初始化std::shared_ptrobj并将其作为Rcpp::XPtr对象返回到R端,c++,r,rcpp,C++,R,Rcpp,我试过(最少的例子): #包括 #包括 #包括 使用名称空间Rcpp; 使用std::cout; 类TestClass{ 公众: int值; TestClass(int初始值){ 值=初始值; }; }; //[[Rcpp::导出]] SEXP get_test_obj(){ Rcpp::XPtr ptr(std::make_shared(5),true); 返回ptr; }; 但会出现以下错误: no matching function for call to 'Rcpp::XPtr<
#包括
#包括
#包括
使用名称空间Rcpp;
使用std::cout;
类TestClass{
公众:
int值;
TestClass(int初始值){
值=初始值;
};
};
//[[Rcpp::导出]]
SEXP get_test_obj(){
Rcpp::XPtr ptr(std::make_shared(5),true);
返回ptr;
};
但会出现以下错误:
no matching function for call to 'Rcpp::XPtr<std::shared_ptr<TestClass> >::XPtr(std::shared_ptr<TestClass>, bool)'
调用“Rcpp::XPtr::XPtr(std::shared_ptr,bool)”时没有匹配的函数
有什么办法吗?还是我的想法错了?我怀疑R端是否会期望将std::shared\u ptr传递给它。我假设源代码中的其他一些代码依赖于std::shared_ptr,但您希望将内部原始指针传递给R。我还假设std::shared_ptr的生命周期在您的代码中得到更适当的管理,因为呈现的代码会使std::shared_ptr在函数完成后超出范围,并在下一次取消引用时崩溃 在任何情况下,如果您只想将内部原始指针传递给R,您可以这样做(人为):
/[[Rcpp::export]]
SEXP get_test_obj(){
std::shared_ptr s_ptr=std::make_shared(5);
Rcpp::XPtr x_ptr(s_ptr.get(),true);
返回x_ptr;
};
来自@d3coy的答案包含了几乎所有的信息Rcpp::XPtr
是一个模板智能指针类,它的参数是指针对象类,而不是它指向的类。因此,Rcpp::XPtr
将是指向std::shared\u ptr*
的智能指针。注意*
,这是重要的一点
当共享\u ptr
超出范围时,如果它是原始指针的最后一个持有者,则原始指针可能会被删除。那绝对不是你想要的
相反,您可以使用new
创建一个原始指针,并使用该指针馈送XPtr
。当垃圾收集器在XPtr
下收集R对象时,该指针将获得delete
d,这是处理外部指针时通常需要的
我知道当前的指导原则是尽可能多地使用
make_unique
和make_shared
而不是new
,但在这种情况下,您需要new
。聪明来自于XPtr
,如果你把它与shared\u ptr
混在一起,它们会互相妨碍 感谢您提供的所有提示和“提示”。不确定这是否是正确的回应方式,但我想我应该输入我找到的解决方案
关键是R端确实不一定需要std::shared\u ptr
。然而,我正在与现有的C++库接口。我需要实例化库的一个<代码>:ST::SyrdYpPTR<代码>(使用R),并将其反馈到C++算法中,该算法期望<代码> STD::SyrdYPPTR > /P>
我的解决方法如下(示例和未测试):
#包括
#包括
#包括
使用名称空间Rcpp;
使用std::cout;
类TestClass{
公众:
int值;
TestClass(int initial_val):值(initial_val){}
};
类TestClassContainer{
公众的
std::共享测试类对象;
TestClassContainer():test_class_obj(std::make_shared()){}
};
//[[Rcpp::导出]]
SEXP get_test_obj(){
Rcpp::XPtr ptr(newtestclasscontainer(),true);
返回ptr;
};
//[[Rcpp::导出]]
SEXP do_something_与共享的测试类(SEXP test_container_obj){
Rcpp::XPtr测试ptr(测试容器obj);
ExternalLib::do_函数(test_container_obj->test_class_obj);
};
然后在R中,我可以做:
test_container <- get_test_obj()
do_something_with_shared_ptr_testclass(test_container)
test\u container有一些项目使用了Rcpp::XPtr
,也许更仔细地研究一下它们的功能可以帮助您?确实有。编译器说“shared\u ptr”不是“std”的成员。它还在工作吗?启用对C++11的支持。
//[[Rcpp::export]]
SEXP get_test_obj() {
std::shared_ptr<TestClass> s_ptr = std::make_shared<TestClass>(5);
Rcpp::XPtr<TestClass> x_ptr(s_ptr.get(), true);
return x_ptr;
};
#include <iostream>
#include <memory>
#include <Rcpp.h>
using namespace Rcpp;
using std::cout;
class TestClass {
public:
int value;
TestClass(int initial_val): value(initial_val) {}
};
class TestClassContainer {
public
std::shared_ptr<TestClass> test_class_obj;
TestClassContainer(): test_class_obj(std::make_shared<TestClass>()) {}
};
//[[Rcpp::export]]
SEXP get_test_obj() {
Rcpp::XPtr<TestClassContainer> ptr(new TestClassContainer(), true);
return ptr;
};
//[[Rcpp::export]]
SEXP do_something_with_shared_ptr_testclass(SEXP test_container_obj) {
Rcpp::XPtr<ResourceContainer> test_ptr(test_container_obj);
ExternalLib::do_function(test_container_obj->test_class_obj);
};
test_container <- get_test_obj()
do_something_with_shared_ptr_testclass(test_container)