2012-04-19 5 views
7

내가자동 프록시 클래스

Proxy *p; 
p->f(1); 
을 쓸 때 내가

class Proxy : I 
{ 
    I * i[5]; 
public: 
    void f(int id) 
    { 
     i[id]->f(id); 
    } 

    void g(int id, float x) 
    { 
     i[id]->g(id, x); 
    } 

} 

그래서 포인터 매핑 ID의 일종을 수행하는 프록시 클래스가 필요

class I{ 
public: 
    virtual void f(int id)=0; 
    virtual void g(int id, float x)=0; 
} 

인터페이스를 가지고 가정

f가 id = 1 인 객체에서 호출되었습니다.

그런 경우가 많고 인터페이스가 다소 있습니다. 그래서 프록시 클래스의 모든 함수를 코딩하고 싶지는 않습니다. 자동으로 수행하는 방법이 있습니까? 어쩌면 과부하, 매크로, 템플릿을 사용하여 "->"등

+0

있습니까? – hansmaad

+0

약간 혼란 스럽습니다. 나는 그 자신의 인덱스를 모르지만 그의 f 또는 g 메소드가 호출 될 때를 알게됩니다 ... 왜? 이상한 디자인. 나는 그 자신의 색인을 결코 모르는 채로 모든 것을 계획 할 것이다. 그것은 더 나은 이해가 될 것입니다. –

+0

@hansmaad, 많은 인터페이스 (일대일)를위한 많은 프록시 –

답변

4

쉬운 해결책은 인터페이스에 포인터를 반환하는 연산자 ->를 정의하는 것입니다. 그러나 이것은 모든 사람들이 당신의 객체에 직접 접근 할 수 있고 당신이 실제로 당신의 프록시 클래스를 필요로하지 않기 때문에 당신의 캡슐화를 깨뜨릴 것입니다 (당신은 std :: map을 사용할 수도 있습니다). 그것은 당신의 컴파일러로 컴파일되지 않을 수도 있습니다

대체 당신은 주로 C++ 11 개 기능에 의존

template <typename Interface> 
class Proxy 
{ 
    Interface* interfaces[5]; 
public: 
    template <typename F, typename... Params> 
    auto operator()(F f, const int id, Params... parameters) 
      -> decltype((interfaces[id]->*f)(id, parameters...)) 
    { return (interfaces[id]->*f)(id, parameters...); } 
}; 

뭔가를 할 수 있습니다.

먼저 Variadic 템플릿을 사용합니다. 자세한 내용은 https://en.wikipedia.org/wiki/Variadic_Templates을 참조하십시오.

다음으로는 decl_type을 사용합니다. 자세한 내용은 https://en.wikipedia.org/wiki/Decltype을 참조하십시오.

이처럼 사용할 수있다 : 당신이 많은 인터페이스에 대한에 같은 프록시, 또는 여러 프록시 클래스와 동일한 인터페이스, 또는 여러 프록시 쓰기가 많은 인터페이스는

Proxy<I> p; 
    ... 

    p(&I::f,1); 
    p(&I::g,3, 1.); 
+0

woow! 우리는 C++ 11 호환 컴파일러를 가지고 있지 않지만 이것은 아름답습니다! 고맙습니다! –

+0

다음 대답을 수락 할 수 :-) – BertR

+0

글쎄,이게 내가 얻을 수있는 가장 좋은 것 같아요 :) –

0

이 당신을 위해 적합한 지 나도 몰라,하지만 기능이 사용하여 포인터를 돌볼 수 ...

즉.

#include <stdio.h> 

typedef void (*f)(int); 

void f1(int a) 
{ 
    printf("f1: %d\n", a); 
} 
void f2(int a) 
{ 
    printf("f2: %d\n", a); 
} 
int main(int argc, char *argv[]) 
{ 
    f array[5] = {NULL}; // create array of pointers 
    array[0] = f1; // assign different functions on them 
    array[1] = f2; // -||- 

    array[0](10); // call them 
    array[1](12); 

    // and you end up with something like "array[i]();" in your proxy class... 
}