2012-04-12 3 views
1

По структурным причинам я хотел бы передать экземпляр функтора другому функтору. В настоящий момент я достигаю чего-то эквивалентного, передавая указатель на функцию моему функтору.Передача экземпляра функтора другому функтору

Я попытался инкапсулировать идею некоторого минимального кода ниже:

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).

+0

Вам нужен std :: bind. Он может цепочки функторов и связывать параметры. – innochenti

ответ

3

Использование ссылок?

class A { /* ... */ }; 

class B 
{ 
    A &a; 

public: 
    B(const A &my_a) 
     : a(my_a) 
    { } 

    // ... 
}; 
+0

Amazing. Очень смущаю, что я не думал об этом в первую очередь. Независимо от того, вы спасли меня несколько часов, стуча в мою голову против клавиатуры macbook, и я очень * очень благодарен. Благодаря! – qubyte

Смежные вопросы