2012-04-19 21 views
7

Przyjmijmy, mam interfejsAutomatyczne Klasa Proxy

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

muszę klasy proxy, aby zrobić jakieś id do mapowania wskaźnik

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); 
    } 

} 

Więc kiedy piszę

Proxy *p; 
p->f(1); 

f jest wywoływane na obiekcie o numerze id = 1

jest kilka takich przypadków, a interfejsy są dość duże. Nie chcę więc kodować wszystkich funkcji w klasie proxy. Czy można to zrobić automatycznie? może za pomocą makra, szablony, przeciążenia „->” itp

+0

Są tam wiele interfejsów piszesz tego samego serwera proxy dla lub wiele klas proxy dla tego samego interfejsu, lub wiele serwerów proxy dla wielu interfejsów? – hansmaad

+0

To trochę zagmatwane: wygląda na to, że nie znam jego własnego indeksu, ale dowiaduję się, kiedy jego metody są nazywane ... dlaczego? dziwny projekt. Planowałbym całą sprawę, nigdy nie znając jego indeksu. To miałoby większy sens. –

+0

@hansmaad, wiele serwerów proxy dla wielu interfejsów (jeden-do-jednego) –

Odpowiedz

4

Łatwe rozwiązanie polega na zdefiniowaniu operatora->, który zwraca wskaźnik do interfejsu. Ale to złamie hermetyzację, ponieważ każdy może uzyskać bezpośredni dostęp do twoich obiektów i faktycznie nie potrzebujesz swojej klasy proxy (możesz równie dobrze użyć std :: map).

alternatywna można zrobić coś takiego

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

To mocno opiera się na C++ 11 cech, więc nie może skompilować z kompilatora.

Najpierw używa szablonów Variadic. Aby uzyskać więcej informacji, patrz https://en.wikipedia.org/wiki/Variadic_Templates.

Następnie używa decl_type. Aby uzyskać więcej informacji, patrz https://en.wikipedia.org/wiki/Decltype.

Trzeba używać go tak:

Proxy<I> p; 
    ... 

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

woow! nie mamy kompilatora zgodnego z C++ 11, ale jest to po prostu piękne! Dziękuję Ci! –

+0

Czy możesz wtedy przyjąć odpowiedź :-) – BertR

+0

cóż, myślę, że to jest najlepsze, co mogę dostać :) –

0

Nie wiem, czy to jest odpowiedni dla ciebie, ale można zadbać o to za pomocą wskaźników do funkcji ...

tj.

#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... 
} 
Powiązane problemy