Чтобы иметь возможность использовать std::function
в C ++, вы должны включить правильный заголовок через
#include <functional>
где-нибудь в вашей базе кода.
Что касается стороны R, у вас естьсообщить компилятору, что вы хотите использовать функции C ++ 11.Если у вас есть только файл .cpp
, который вы добавляете через Rcpp::sourceCpp
, вам нужно добавить
// [[Rcpp::plugins(cpp11)]]
в ваш файл .cpp
.
Если вы пишете пакет R(для этого предназначена виньетка, которую вы цитируете), тогда файл src/Makevars
больше не является обязательным для использования Rcpp
, но использование CXX_STD
в src/Makevars
- это рекомендуемый способ запроса C ++ 11 при написаниипакет.В качестве альтернативы вы можете использовать SystemRequirements
в DESCRIPTION
.Ссылаясь на Запись расширений R :
Чтобы использовать код C ++ 11 в пакете, файл Makevars пакета (или Makevars.win в Windows) должен содержать строку
CXX_STD = CXX11
Компиляция и компоновка будут выполняться с помощью компилятора C ++ 11.
Пакеты без файла src / Makevars или src / Makefile могут указывать, чтоони требуют C ++ 11 для кода в каталоге src, включая «C ++ 11» в поле «SystemRequirements» файла DESCRIPTION, например,
SystemRequirements: C ++ 11
Если в пакете есть файл src / Makevars [.win], то установка переменной make 'CXX_STD' предпочтительна, поскольку позволяет R CMD SHLIB корректно работать в каталоге src пакета.
InКроме того, вы должны убедиться, что сигнатура возвращаемой функции и лямбда идентичны (см., например, здесь ).В настоящее время вы используете ссылки только для одного из них.И то, и другое возможно, просто нужно быть последовательным:
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <functional>
// [[Rcpp::depends(BH)]]
#include <boost/array.hpp>
typedef boost::array<double, 3> state_type;
// references
std::function<void(const state_type&, state_type&, const double)> eqsir2(const Rcpp::NumericVector theta) {
return [&theta](const state_type &x, state_type &dxdt, const double t) {return;};
}
// no references
std::function<void(const state_type, state_type, const double)> eqsir(const Rcpp::NumericVector theta) {
return [&theta](const state_type x, state_type dxdt, const double t) {return;};
}