unordered_map 在函数参数中
unordered_map in a function argument
问题
为什么使用 std::unordered_map
作为函数参数编译失败(我该如何解决)?
例子
第一个函数将 std::unordered_map
作为函数参数,但编译失败
library(Rcpp)
cppFunction(
code = 'void test( std::unordered_map< std::string, std::string > um ) {
}'
, plugins = "cpp11"
)
而在函数体中声明就可以了
cppFunction(
code = 'void test( ) {
std::unordered_map< std::string, std::string > um;
}'
, plugins = "cpp11"
)
额外
我已经成功地将它用作我的 spatialwidget
库中的函数参数 here in an inline 函数
理解答案
感谢 Ralf Stubner 的解释。总之,当使 Rcpp 函数可由 R 调用时,必须有对象的等效 R 表示。
此代码失败,因为 R
中没有等效的 unordered_map
// [[Rcpp::export]]
void test( std::unordered_map< std::string, std::string > um ) {
}
这通过了,因为它没有被调用/导出到 R
void test( std::unordered_map< std::string, std::string > um ) {
}
您可以使用 std::vector
和 std::list
之类的东西作为函数参数,并在函数中使用 return 值 可从 R 调用,因为那里Rcpp::as
和 Rcpp::wrap
存在适当的特化,可以在这些 C++ 数据结构和 R 知道的 SEXP
之间进行转换(双向)。现在 R 没有原生的 map-like 数据类型(尽管可以在某种程度上使用命名列表),这(可能)就是为什么 Rcpp 没有对 std::unordered_map
的内置翻译。对于只能从 C++ 调用的函数没有这样的限制,这就是你的 "extra" 示例有效的原因。
原则上你可以自己定义这样的转换函数,c.f。 http://gallery.rcpp.org/articles/custom-templated-wrap-and-as-for-seamingless-interfaces/ 和其中的参考文献。但是,您首先必须决定要在 R-side.
处使用哪种类型的数据结构
问题
为什么使用 std::unordered_map
作为函数参数编译失败(我该如何解决)?
例子
第一个函数将 std::unordered_map
作为函数参数,但编译失败
library(Rcpp)
cppFunction(
code = 'void test( std::unordered_map< std::string, std::string > um ) {
}'
, plugins = "cpp11"
)
而在函数体中声明就可以了
cppFunction(
code = 'void test( ) {
std::unordered_map< std::string, std::string > um;
}'
, plugins = "cpp11"
)
额外
我已经成功地将它用作我的 spatialwidget
库中的函数参数 here in an inline 函数
理解答案
感谢 Ralf Stubner 的解释。总之,当使 Rcpp 函数可由 R 调用时,必须有对象的等效 R 表示。
此代码失败,因为 R
中没有等效的unordered_map
// [[Rcpp::export]]
void test( std::unordered_map< std::string, std::string > um ) {
}
这通过了,因为它没有被调用/导出到 R
void test( std::unordered_map< std::string, std::string > um ) {
}
您可以使用 std::vector
和 std::list
之类的东西作为函数参数,并在函数中使用 return 值 可从 R 调用,因为那里Rcpp::as
和 Rcpp::wrap
存在适当的特化,可以在这些 C++ 数据结构和 R 知道的 SEXP
之间进行转换(双向)。现在 R 没有原生的 map-like 数据类型(尽管可以在某种程度上使用命名列表),这(可能)就是为什么 Rcpp 没有对 std::unordered_map
的内置翻译。对于只能从 C++ 调用的函数没有这样的限制,这就是你的 "extra" 示例有效的原因。
原则上你可以自己定义这样的转换函数,c.f。 http://gallery.rcpp.org/articles/custom-templated-wrap-and-as-for-seamingless-interfaces/ 和其中的参考文献。但是,您首先必须决定要在 R-side.
处使用哪种类型的数据结构