По структурным причинам я хотел бы передать экземпляр функтора другому функтору. В настоящий момент я достигаю чего-то эквивалентного, передавая указатель на функцию моему функтору.Передача экземпляра функтора другому функтору
Я попытался инкапсулировать идею некоторого минимального кода ниже:
class A
{
private:
double _x, _y, _z;
public:
A (double x, double y, double z) : _x(x), _y(y), _z(z) {};
void operator() (double t) const
{
// Some stuff in here that uses _x, _y, _z, and t.
}
};
class B
{
private:
// What is the type of the functor instance?
??? A ???
public:
// How do I pass the instance of A into B at initialisation?
B (??? A ???) : ??? : {};
void operator() (double tau) const
{
// Something that uses an instance of A and tau.
}
};
int main(void)
{
// I want to do something like this:
A Ainst(1.1, 2.2, 3.3); // Instance of A.
B Binst(Ainst); // Instance of B using instance of A.
Binst(1.0); // Use the instance of B.
return 0
}
В сущности, я хочу, чтобы быть в состоянии цепи до функторов. Как указано выше, я в настоящее время делаю это, передавая указатель на функцию B вместе с переменными x, y и z. В моем коде B шаблон и цель состоит в том, чтобы написать его один раз, а затем повторно использовать его без каких-либо изменений позже, а это означает, что передача x, y и z в B не идеальна. А, с другой стороны, будет настроена для каждой программы, которую я пишу. Я не возражаю против того, чтобы B был довольно грязным, но я хочу, чтобы A был красивым и чистым, поскольку это та часть, которая будет выставлена.
Для тех, кто знает некоторую квантовую механику, B - уравнение Шредингера (или основное уравнение), а A - зависящий от времени гамильтониан. Переменные x, y и z используются для построения гамильтониана, а t - время, позволяющее мне использовать библиотеку odeint (поэтому я использую ublas и пару других бит Boost).
Вам нужен std :: bind. Он может цепочки функторов и связывать параметры. – innochenti