2012-04-12 2 views
1

구조상 이유로 functor의 인스턴스를 다른 functor로 전달할 수 있습니다. 지금은 함수에 대한 포인터를 함수 작성기로 전달하여 비슷한 결과를 얻습니다.functor 인스턴스를 다른 functor에 전달

나는 아래 최소한의 코드에서 아이디어를 캡슐화을 시도했습니다 본질적으로

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 
} 

, 나는 체인까지 펑터에 수 있어야합니다. 위에서 언급했듯이, 저는 현재 변수 포인터를 변수 x, y, z와 함께 B에 전달하여이를 수행합니다. 내 코드 B에서 템플릿 및 목표는 한 번 쓰고 나중에 수정없이 다시 사용하는 것이므로 x, y 및 z를 B에 전달하는 것이 이상적이지 않음을 의미합니다. 반면에 A는 내가 작성한 각 프로그램에 맞게 사용자 정의됩니다. 나는 B가 아주 지저분한 것은 신경 쓰지 않지만, A가 노출 될 부분이기 때문에 A가 좋고 깨끗하기를 바란다.

일부 양자 역학을 아는 사람들에게는 B가 슈뢰딩거 방정식 (또는 마스터 방정식)이고 A는 시간 의존형 해밀턴 학자입니다. 변수 x, y, z는 해밀턴을 구성하는 데 사용되며, t는 시간이므로, odeint 라이브러리를 사용할 수 있습니다 (그래서 나는 ublas와 몇 가지 다른 부스트 비트를 사용하고 있습니다).

+0

std :: bind가 필요합니다. 펑터를 연결하고 매개 변수를 바인딩 할 수 있습니다. – innochenti

답변

3

참조 사용?

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

class B 
{ 
    A &a; 

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

    // ... 
}; 
+0

놀라운. 매우 당황 스럽지만 나는 이것을 처음으로 생각하지 않았다. 어쨌든, 맥북 키보드에 맞서 몇 시간 동안 머리를 두드리는 시간을 절약 해 주었고, 매우 감사합니다. 감사! – qubyte