2016-05-07 3 views
1

Так что у меня есть класс А:Автоматически копировать все методы

class A{ 
    public: 
    void DoSomething(); 
    void DoSomethingElse(int x); 
}; 

И я хочу, чтобы иметь еще один класс прокси:

class Proxy{ 
    A* a; 
    public: 
    void DoSomething(){ a->DoSomething(); } 
    void DoSomethingElse(int x){ a->DoSomethingElse(x); } 
}; 

Но загвоздка в том, что я хочу быть в состоянии сделать Proxy шаблонный класс, так что я могу сделать этот вид преобразования для любого класса ....

есть ли какое-то трюк, что я могу сделать?

Подробное описание:

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

я в основном прошу есть что-то похожее на переопределение оператора точки, как в этом вопросе: Why can't you overload the '.' operator in C++? (Ответ там было «нет»)

+0

@kfsone Я не уверен, что понимаю ваш вопрос – DarthRubik

+0

Вам нужен только шаблонный класс? Или, может быть, вы попадаете в наследство. –

+0

@TrevorHickey Ну, основное различие между этим и наследованием - это __size__ результирующего класса, поэтому я делаю это так. (размер прокси - sizeof (ptr_t)) – DarthRubik

ответ

0

Рассмотрят два типа с той же функциональностью.

struct A{ 
    void DoSomething(){ 
     std::cout << "A::DoSomething\n"; 
    } 
    void DoSomethingElse(int x){ 
     std::cout << "A::DoSomething(int)\n"; 
    } 
}; 

struct B{ 
    void DoSomething(){ 
     std::cout << "B::DoSomething\n"; 
    } 
    void DoSomethingElse(int x){ 
     std::cout << "B::DoSomething(int)\n"; 
    } 
}; 

Ваш шаблонный прокси может быть следующим:

template <typename T> 
class Proxy{ 
    T a; 
    public: 
    void DoSomething(){ a.DoSomething(); } 
    void DoSomethingElse(int x){ a.DoSomethingElse(x); } 
}; 

Он будет использоваться как так:

int main(){ 
    Proxy<B> b; 
    Proxy<A> a; 

    a.DoSomething(); 
    a.DoSomethingElse(0); 

    b.DoSomething(); 
    b.DoSomethingElse(0); 
} 

результат:

A::DoSomething 
A::DoSomething(int) 
B::DoSomething 
B::DoSomething(int) 
+1

Я предполагаю Возможно, я не подчеркнул этого достаточно, но это должно работать с ** любым ** классом, который вы называете его ... std :: vector, myRandomClass и т. Д. Это работает только с теми, у кого есть эти особые функции .... Я постараюсь сделать это более ясным в вопросе – DarthRubik

+1

Итак, если класс не имеет конкретного метода, что вы ожидаете от прокси-сервера, когда вы его вызываете? Кажется, я вижу, к чему вы клоните. Вы хотите, чтобы прокси-сервер наследовал методы из того, из чего он происходит. –

+1

Точно, за исключением того, что наследует весь размер, связанный с наследованием – DarthRubik

0

Что вы запрос на C++ невозможен, но это также не полезно, потому что экземпляр Proxy также не будет экземпляром A - вы не можете передавать экземпляры Proxy в методы, требующие As.

На самом деле, не было бы ничего, что могло бы вызвать ваш объект прокси до тех пор, пока вы не получите этих вызовов. Учитывая, что вам приходится писать все прокси-вызовы, действительно ли это так много лишней работы для написания прокси-методов, которые вы вызываете?

+0

Ну, на самом деле это может быть полезно, если вы дали другой параметр шаблона, который является базовым классом 'A', но да, я вижу вашу точку – DarthRubik

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