Хотите ли вы продолжать использовать ускорение - это решение, которое можете принять только вы, но легко создать оболочку без снижения производительности.
Вы захотите обернуть sys
в лямбда который захватывает this
. Это не должно сказаться на производительности, так как лямбда будет встроена при включении оптимизации.
Вы бы назвали это так:
abm.initialize(
[this](const state_type& s, state_type& sdot, const double t) {
this->sys(s, sdot, t);
},
Y[0],
T[0],
dt
);
Лямбда - это, по сути, неявная структура оболочки который содержит ссылку на this
и определяет operator()(const state_type& s, state_type& sdot, const double t)
.
Я создал пример в godbolt , который показывает это, упрощая и заполняя ваш код там, где это необходимо для примера. Если вы измените оптимизацию между -O0
и -O3
, вы увидите, что лямбда-код удален, а внутренний метод полностью встроен.
Другой вариант - использовать std::bind
для создания голой функции из функция-член:
abm.initialize(
std::bind(&ElectronSolver::sys, std::ref(*this), _1, _2, _3),
Y[0],
T[0],
dt
);
вместе с этим в другом месте:
#include <functional>
using namespace std::placeholders;
, чтобы получить все символы в области видимости. std::bind
создает новую функцию, в которой некоторые аргументы уже заполнены. В этом случае неявный первый аргумент, сам объект, заполняется ссылкой на this
. Остальным аргументам даны специальные заполнители, чтобы указать, что новая функция заполнит их своими аргументами. std::ref
, заставляет брать this
по ссылке, а не по копии. Этот метод также будет иметь нулевые накладные расходы.