Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建std::shared_ptr对象并将其返回到R端(Rcpp) 我试图用RCPP写一个C++脚本的绑定。其中一个函数需要一个std::shared_ptr对象。我发现很难初始化std::shared_ptrobj并将其作为Rcpp::XPtr对象返回到R端_C++_R_Rcpp - Fatal编程技术网

创建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)