Мне интересно, есть ли хороший общий способ записи обертки объекта, чтобы вы могли вызывать все методы, определенные классом, который он обертывает сам класс-оболочку (без явного переопределения интерфейса класса в классе оболочки). Например, два разных, произвольные классы:Обертка общего объекта
class InnerExample1 {
public:
InnerExample1(int a, bool b) {...}
void DoSomething1(int a) {...}
bool DoSomething2(bool b) {...}
etc...
};
class InnerExample2 {
InnerExample2(float a, int b) {...}
void DoWork(int a) {...}
bool GetResult(bool b) {...}
etc...
};
Я хотел бы обобщенно определенный класс обертку таким образом, что я мог бы сделать:
Wrapper<InnerExample1> inner1;
inner1.DoSomething(42);
bool result = inner1.DoSomething2(false);
и
Wrapper<InnerExample2> inner2;
inner2.DoWork(21);
bool result = inner2.GetResult(true);
С 'обертке' будучи достаточно общим, чтобы иметь возможность обрабатывать оболочку либо класса, либо пересылать все вызовы, сделанные на нее, на внутренний делегат.
Я видел код для таких вещей, как фабричный шаблон, где с переменными аргументами общая фабрика может создавать экземпляр любого класса, а также обобщать привязку к одному методу-члену, но ничего, что было сделано для всего класс. Мне кажется, что это невозможно ... но люди на SO придумывают всевозможные вещи, которых у меня никогда не было бы :)
EDIT: Я старался держать вопрос простым, оставив ненужным подробности, но я забыл слишком много. Мне нужна оболочка, чтобы вставить некоторую логику вокруг каждого вызова. Скажем, например, я хочу, чтобы этот обертер мог подсчитывать, сколько раз каждый метод был вызван в дополнение к переадресации вызова внутреннему объекту.
EDIT2: Чтобы быть конкретным, я пытаюсь написать общую оболочку для реализации шаблона ActiveObject. Я закончил создание базового класса «Active», который обрабатывает общие биты (управление внутренним потоком, вызовы вызова в очереди) и запись подклассов для каждого внутреннего типа (с их интерфейсом, имитируемым).
EDIT3: Ответ на вопрос @ id256 довольно интересен, я думаю, что в какой-то момент вернусь и попробую этот метод.
Как насчет переопределения 'operator ->()'? – rodrigo