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::vectorstd::list 之类的东西作为函数参数,并在函数中使用 return 值 可从 R 调用,因为那里Rcpp::asRcpp::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.

处使用哪种类型的数据结构