2012-04-19 34 views
7

Giả sử tôi có một giao diệnAutomatic Proxy Lớp

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

Tôi cần một lớp proxy, để làm một số loại id để lập bản đồ con trỏ

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

} 

Vì vậy, khi tôi viết

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

f được gọi trên đối tượng có id = 1

có một số trường hợp và giao diện tương đối lớn. Vì vậy, tôi không muốn mã tất cả các chức năng trong lớp proxy. Có cách nào để tự động thực hiện không? có lẽ sử dụng các macro, mẫu, quá tải "->" vv

+0

Có nhiều giao diện bạn viết cùng một proxy cho, hoặc nhiều lớp proxy cho cùng một giao diện, hoặc nhiều proxy cho nhiều giao diện? – hansmaad

+0

có một chút khó hiểu: có vẻ như vậy và ví dụ của tôi không biết chỉ mục của riêng mình, nhưng nó được biết khi nào các phương pháp f hoặc g của anh ta được gọi là ... tại sao? thiết kế lạ. Tôi sẽ lập kế hoạch toàn bộ điều với tôi không bao giờ biết chỉ số của riêng mình. Điều đó sẽ có ý nghĩa tốt hơn. –

+0

@hansmaad, nhiều proxy cho nhiều giao diện (một-một) –

Trả lời

4

Giải pháp dễ dàng là xác định toán tử-> trả về con trỏ đến giao diện. Nhưng điều này sẽ phá vỡ đóng gói của bạn vì mọi người có thể truy cập trực tiếp các đối tượng của bạn và bạn thực sự không cần lớp proxy của bạn (bạn cũng có thể sử dụng std :: map).

Alternative bạn có thể làm một cái gì đó giống như

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

Nó nặng nề dựa trên C++ 11 tính năng nên nó có thể không biên dịch với trình biên dịch của bạn.

Đầu tiên sử dụng các mẫu Biến thể. Xem https://en.wikipedia.org/wiki/Variadic_Templates để biết thêm thông tin.

Tiếp theo sử dụng decl_type. Xem https://en.wikipedia.org/wiki/Decltype để biết thêm thông tin.

Bạn phải sử dụng nó như thế này:

Proxy<I> p; 
    ... 

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

woow! chúng tôi không có một trình biên dịch C++ 11 tương thích nhưng, điều này chỉ là đẹp! Cảm ơn bạn! –

+0

Sau đó bạn có thể chấp nhận câu trả lời :-) – BertR

+0

tốt, tôi đoán đây là cách tốt nhất tôi có thể nhận :) –

0

Tôi không biết nếu điều này là phù hợp với bạn, nhưng bạn có thể chăm sóc bản này sử dụng các con trỏ tới các chức năng ...

tức.

#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... 
} 
Các vấn đề liên quan