Rcpp Modules导出重载方法的正确实现方式咨询
Rcpp Modules重载方法导出问题
核心疑问
Rcpp Modules是否提供了官方规范的内置方式,用于导出C++重载方法?
现状与问题复现
- 官方配套的Rcpp Modules说明文档2.2.5节目前仍标注
TODO: mention overloading, need good example.,尚未给出重载方法导出的官方示例与标准用法说明。 - 参考社区流传的重载适配方案可完成代码编译,但存在调用逻辑异常,复现代码如下:
library(Rcpp) # C++侧定义测试类 sourceCpp(code = paste0(' #include<Rcpp.h> class Test { private: int a; public: Test(): a{0} {}; Test(int x): a{x} {}; int foo(); int foo(int x); }; int Test::foo() { return a; } int Test::foo(int x) { return a + x; } RCPP_MODULE(rawdata_module) {', # 方案1:显式声明不同重载版本的成员函数指针 ' int (Test::*foo1)(int x) = &Test::foo; int (Test::*foo0)() = &Test::foo; Rcpp::class_<Test>( "Test" ) .constructor() .constructor<int>()', # 注意:该写法下必须先注册带参版本,再注册无参版本才能临时正常运行 ' .method("foo", foo1) .method("foo", foo0)', # 方案2:直接在注册时做函数指针类型强转 ' //.method("foo", ( int (Test::*)(int) )(&Test::foo) ) //.method("foo", ( int (Test::*)() )(&Test::foo) ) ; } ')) # R侧创建测试对象 obj0 <- Test$new() obj1 <- Test$new(5L) # 重载逻辑测试 obj0$foo() obj0$foo(3L) obj1$foo() obj1$foo(3L)
- 测试验证两种方案均存在稳定性缺陷:如果调换重载方法的注册顺序,先注册无参版本的
foo、再注册带1个int参数的foo,代码可正常编译,R端也支持传入不同数量的参数发起调用,但实际运行时永远只会执行无参版本的逻辑,无法匹配到带参的重载分支。
测试环境信息
- 编译器版本:gcc (Debian 10.2.1-6) 10.2.1 20210110
- R版本:4.2.0 (2022-04-22)
- 运行平台:x86_64-pc-linux-gnu (64-bit)
完整会话配置信息如下:
R version 4.2.0 (2022-04-22) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Progress Linux 6.99 (fuchur-backports) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0 locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 [6] LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] Rcpp_1.0.8.3 colorout_1.2-2 loaded via a namespace (and not attached): [1] compiler_4.2.0 tools_4.2.0 codetools_0.2-18 RhpcBLASctl_0.21-247.1
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

