Ответ 1
(Иногда вам нужно использовать svn log ...
для файлов, чтобы узнать, насколько они датированы...)
Я думаю, что лучший вариант использования - это мой "порт" на основе D-кода на основе R на Rcpp/RcppArmadillo: RcppDE. В нем я разрешаю подпрограмме оптимизации использовать либо функцию R (как это делает DEoptim), либо предоставленную пользователем скомпилированную функцию - вот что вы хотите здесь, как я ее понимаю.
Существует небольшая часть лесов С++, но после этого у вас не должно быть никаких проблем.
Изменить в 2013-01-21 Ниже представлено полное решение, которое я также выслал как этот новый пост в галерее Rcpp - включая некоторые комментарии и примеры использования.
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace arma;
using namespace Rcpp;
vec fun1_cpp(const vec& x) { // a first function
vec y = x + x;
return (y);
}
vec fun2_cpp(const vec& x) { // and a second function
vec y = 10*x;
return (y);
}
typedef vec (*funcPtr)(const vec& x);
// [[Rcpp::export]]
XPtr<funcPtr> putFunPtrInXPtr(std::string fstr) {
if (fstr == "fun1")
return(XPtr<funcPtr>(new funcPtr(&fun1_cpp)));
else if (fstr == "fun2")
return(XPtr<funcPtr>(new funcPtr(&fun2_cpp)));
else
return XPtr<funcPtr>(R_NilValue); // runtime error as NULL no XPtr
}
// [[Rcpp::export]]
vec callViaString(const vec x, std::string funname) {
XPtr<funcPtr> xpfun = putFunPtrInXPtr(funname);
funcPtr fun = *xpfun;
vec y = fun(x);
return (y);
}
// [[Rcpp::export]]
vec callViaXPtr(const vec x, SEXP xpsexp) {
XPtr<funcPtr> xpfun(xpsexp);
funcPtr fun = *xpfun;
vec y = fun(x);
return (y);
}