首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rcpp Enum支持

Rcpp Enum支持
EN

Stack Overflow用户
提问于 2017-10-23 18:46:35
回答 2查看 407关注 0票数 2

我正在使用Rcpp模块导出类方法。其中一些方法具有作为枚举的返回类型。例如:

代码语言:javascript
运行
复制
#include "Enum.h"
#include <Rcpp.h>
using namespace Rcpp;

class EnumTest{
public:
  EnumTest(){}
  void setP(Polarization pol){p = pol;}
  Polarization getP(){return p;}
private:
  Polarization p;
};

RCPP_EXPOSED_CLASS(EnumTest)
RCPP_MODULE(EnumTest){
  class_<EnumTest>("EnumTest")
  .property("p", &EnumTest::getP, &EnumTest::setP)
  ;
}

极化是一个枚举,其定义如下:

代码语言:javascript
运行
复制
enum Polarization{
  HORIZONTAL_POL = 0,
  VERTICAL_POL   = 1
};

当我试图构建代码时,我会得到以下错误。

初始化时无法将“SEXP”转换为“极化”

是否存在向Rcpp公开枚举的方法,类似于如何公开类?我在Rcpp模块中注意到,枚举类型列在未来的扩展项下。这是否意味着没有办法这样做?如果是的话,有没有可能的解决办法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-24 11:24:17

这里给出的Rcpp中对枚举的支持有限。

所以你可以这样做:

代码语言:javascript
运行
复制
#include <Rcpp.h>
using namespace Rcpp; 

enum Polarization{
  HORIZONTAL_POL = 0,
  VERTICAL_POL   = 1
};

RCPP_EXPOSED_ENUM_NODECL(Polarization)

class EnumTest{
  public:
    EnumTest(){}
  void setP(Polarization pol){p = pol;}
  Polarization getP(){return p;}
  private:
    Polarization p;
};


RCPP_MODULE(Bla){
  class_<EnumTest>("EnumTest")
    .constructor()
    .property("p", &EnumTest::getP, &EnumTest::setP)
  ;
}

这种支持是非常基本的,基本上允许您将枚举作为ints传递,从而失去类和所有东西。有时候就够了。我建议在R端有一个简单的命名列表,以使代码更清晰。

代码语言:javascript
运行
复制
Polarization <- list( HORIZONTAL_POL = 0L, VERTICAL_POL = 1L )

这样你就可以做。

代码语言:javascript
运行
复制
test <- new( EnumTest )
test$p <- Polarization$HORIZONTAL_POL
names(which( test$p == Polarization ))
## [1] "HORIZONTAL_POL"
票数 5
EN

Stack Overflow用户

发布于 2017-10-23 19:17:15

如文档所示,从R到R的唯一接口(我们使用/一个应该使用)是

代码语言:javascript
运行
复制
SEXP .Call(yourFunction, SEXP a, SEXP b, SEXP c, ...)

Rcpp将您的转换器提供给/来自基本类型。但是您的枚举不是这些基本元素之一,所以您必须编写自己的转换器,或者只是传递将传递的整数值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46896404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档