Способ изменить параметр виртуального метода не создавая копию переменной
Есть следующий упрощенный код:
class RHS
{
public:
virtual ~RHS() {}
virtual void operator()(const std::vector<double>& x, std::vector<double>& f, const double t) = 0;
};
class MyRHS : public RHS
{
public:
void operator()(const std::vector<double>& x, std::vector<double>& f, const double t) override
{
// вычисляем f
}
};
auto main(int, char* []) -> int
{
MyRHS rhs{};
std::vector<double> f(10, 0);
std::vector<double> x(10, 0);
std::vector<double> x_changed{x};
x_changed[4] += 0.1;
rhs(f, x_changed, 1.0);
return 0;
}
Задача стоит - избавиться от создания копии x. Есть идея создать view-обёртку, например:
template<typename state>
class Variation
{
using state_t = state;
using value_t = typename state_t::value_type;
const state_t& x_;
const size_t i_{};
const value_t δ_;
public:
Variation(const state_t& x, const size_t i, const value_t δ)
: x_(x), i_(i), δ_(δ) {}
const value_t operator[](size_t idx) const
{
if (i_ == idx)
return x_[idx] + δ_;
else
return x_[idx];
}
};
Но как передать её в RHS, не изменяя класс RHS. Может есть еще какие то способы избавиться от копирования в данном случае, не затрагивая сам класс RHS?