我正在使用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)
;
}
极化是一个枚举,其定义如下:
enum Polarization{
HORIZONTAL_POL = 0,
VERTICAL_POL = 1
};
当我试图构建代码时,我会得到以下错误。
初始化时无法将“SEXP”转换为“极化”
是否存在向Rcpp公开枚举的方法,类似于如何公开类?我在Rcpp模块中注意到,枚举类型列在未来的扩展项下。这是否意味着没有办法这样做?如果是的话,有没有可能的解决办法?
发布于 2017-10-24 11:24:17
宏这里给出的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)
;
}
这种支持是非常基本的,基本上允许您将枚举作为ints传递,从而失去类和所有东西。有时候就够了。我建议在R端有一个简单的命名列表,以使代码更清晰。
Polarization <- list( HORIZONTAL_POL = 0L, VERTICAL_POL = 1L )
这样你就可以做。
test <- new( EnumTest )
test$p <- Polarization$HORIZONTAL_POL
names(which( test$p == Polarization ))
## [1] "HORIZONTAL_POL"
发布于 2017-10-23 19:17:15
如文档所示,从R到R的唯一接口(我们使用/一个应该使用)是
SEXP .Call(yourFunction, SEXP a, SEXP b, SEXP c, ...)
Rcpp将您的转换器提供给/来自基本类型。但是您的枚举不是这些基本元素之一,所以您必须编写自己的转换器,或者只是传递将传递的整数值。
https://stackoverflow.com/questions/46896404
复制相似问题