Rcpp 枚举支持

Iro*_*ce7 2 c++ enums r rcpp

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

#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)
  ;
}
Run Code Online (Sandbox Code Playgroud)

Polarization 是一个枚举,定义如下:

enum Polarization{
  HORIZONTAL_POL = 0,
  VERTICAL_POL   = 1
};
Run Code Online (Sandbox Code Playgroud)

当我尝试构建代码时,出现以下错误。

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

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

Rom*_*ois 5

Rcpp 中对枚举的支持有限,由此处的宏给出。

所以你可以做这样的事情:

#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)
  ;
}
Run Code Online (Sandbox Code Playgroud)

支持非常基础,基本上允许您将枚举作为整数传递,从而丢失类和所有内容。有时就够了。我建议在 R 端有一个简单的命名列表,以使代码更清晰,例如

Polarization <- list( HORIZONTAL_POL = 0L, VERTICAL_POL = 1L )
Run Code Online (Sandbox Code Playgroud)

这样你就可以做例如

test <- new( EnumTest )
test$p <- Polarization$HORIZONTAL_POL
names(which( test$p == Polarization ))
## [1] "HORIZONTAL_POL"
Run Code Online (Sandbox Code Playgroud)