使用 C++ 函数作为由导出的 Rcpp 函数调用的另一个 C++ 函数的参数

Use a C++ function as an argument for another C++ function called by an exported Rcpp function

我看到可以使用 Rcpp 将 R 函数作为参数传递给 C++。例如,您可以这样做:

// [[Rcpp::export]]
arma::mat example_cpp_func(Rcpp::Function my_r_func, arma::mat a){
  return Rcpp::as<arma::mat>(my_r_func(a));
}

很好,但我正在寻找稍微不同的东西。

设以下函数:

arma::mat f1(arma::mat& a){
  return a;
}

arma::mat func_2(Rcpp::Function g, arma::mat a){
  return Rcpp::as<arma::mat>(g(a));
}

我想在使用 func_1 作为参数的第三个函数中调用 func_2。那可能吗?例如,我想做的是:

// [[Rcpp::export]]
arma::mat func_3(arma::mat a){
  return func_2(func_1, a);
             ## ^^^^ Pass a C++ function as a parameter
}

这在 R 中是可行的,但是当我尝试使用 Rcpp/RcppArmadillo 时,出现以下错误:

could not convert ‘f1’ from ‘arma::mat ()(arma::mat&)’ {aka ‘arma::Mat ()(arma::Mat&)’} to ‘Rcpp::Function’ {aka ‘Rcpp::Function_Impl’}

错误消息说明了一切:对于 C++ f1 是一个需要 arma::mat 作为参数并且 returns 需要 arma::mat 的函数。这与 Rcpp::Function 完全不同,后者是 R 函数的薄包装。我看到三种可能性:

  1. 编写一个替代 f2 函数,它需要一个函数指针或 std::function(需要 C++11)和适当的参数。

  2. f3 添加一个 Rcpp::Function 类型的参数,用于调用 f2.

  3. 使用 Rcpp::EnvironmentRcpp:Function 获得合适的 R 函数。

没有关于用例的更多信息,很难提供更多建议。

这是一个使用 Ralf 在 #1 中编写的方法的完整示例。你可以在这里使用纯 C/C++ 函数指针,尽管你可以用 C++11 做更复杂的事情。

#include<RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

typedef arma::mat (*functype)(arma::mat&);

arma::mat f1(arma::mat& a){
  return a+1;
}

arma::mat f2(functype g, arma::mat a){
  return g(a);
}

//[[Rcpp::export]]
arma::mat f3(arma::mat a){
  return f2(f1, a);
}

右方:

> f3(matrix(1))
     [,1]
[1,]    2