RcppArmadillo passa a função definida pelo usuário

Considere o seguinte código R,

## ----------- R version -----------

caller <- function(x=1:3, fun = "identity", ...){

  ## do some other stuff
  ## ...
  ## then call the function
  eval(call(fun, x))

}

fun1 <- function(x, ...){
  x + x
}

fun2 <- function(x, a = 10) a * x

caller(fun = "fun1")
caller(fun = "fun2")

O usuário pode passar um nome de função "divertido", que é usado porcaller. Eu gostaria de realizar a mesma tarefa comRcppArmadillo objetos (como parte de uma tarefa mais complexa, obviamente). A função seria definida emC++, e o usuário seleciona no nível R referindo-se ao seu nome:

caller_cpp(1:3, "fun1_cpp")

ou

caller_cpp(1:3, "fun2_cpp")

etc.

Aqui está a minha tentativa ingênua para a função de chamador, que ainda não consegue compilar:

## ----------- C++ version -----------

library(Rcpp)
require( RcppArmadillo )    

sourceCpp( code = '

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

       #include <RcppArmadillo.h>

       using namespace arma ; 
       using namespace Rcpp ;


       colvec fun1_cpp(const colvec x)
      {
       colvec y ;
       y = x + x;
       return (y);
      }

       colvec fun2_cpp(const colvec x)
      {
       colvec y ;
       y = 10*x;
       return (y);
      }

     // mysterious pointer business in an attempt 
     // to select a compiled function by its name

      typedef double (*funcPtr)(SEXP);
      SEXP putFunPtrInXPtr(SEXP funname) {
            std::string fstr = Rcpp::as<std::string>(funname);
            if (fstr == "fun1")
                return(Rcpp::XPtr<funcPtr>(new funcPtr(&fun1_cpp)));
            else if (fstr == "fun2")
            return(Rcpp::XPtr<funcPtr>(new funcPtr(&fun2_cpp)));

       }

       // [[Rcpp::export]]
       colvec caller_cpp(const colvec x, character funname)
      {
       Rcpp::XPtr fun = putFunPtrInXPtr(funname);
       colvec y ;
       y = fun(x);
       return (y);
      }

   ')

Editar: adaptou o exemplo depois de seguir a sugestão de Dirk de olhar para o RcppDE.

questionAnswers(1)

yourAnswerToTheQuestion