Новини

Концепти угруповання типів C++

У статті описано спосіб угруповання типів у мові C++, реалізований через шаблонний клас IGroup. За допомогою групи типів ви можете вказати декілька типів об "єкта. Наприклад, ви можете вказати два інтерфейси об'єкта.

Взагалі цей прийом міг бути мовною конструкцією, але такої конструкції ні в одному ЯП не зустрічав (в коментарях мені вже роз'яснили що поштою і про Generics і про Boost і навіть про STL, спасибі за обговорення). Тому було цікаво спробувати реалізувати його на C++.

Припустімо, у вас є декілька інтерфейсів:

1) Flyable

2) Quackable

3) Duck

Якісь із типів будуть реалізовувати всі ці інтерфейси разом, якісь будуть реалізовувати лише частину інтерфейсів. Як визначити, що певний метод працює тільки з об'єктами, що вміють літати (Flyable) і крякати (Quackable)?

Детальніше описано в книжці «Патерни проектування» (Бейтс Б., Сьєрра К., Фрімен Е., Фрімен Е.). Посилання на саму книгу. На сайті видавця є необхідний фрагмент книги з докладним описом проблеми поділу інтерфейсів.

Вашій увазі пропонується наступний шаблон з трьома спеціалізаціями для різного числа параметрів:

Використання шаблону передбачається таким чином:

1) Для реалізації групи інтерфейсів:

2) Для перерахування необхідних інтерфейсів у параметрах методів:

Таким чином у типі параметра явним чином перераховуються інтерфейси, які повинен реалізовувати об'єкт.

У описаного вище шаблонного класу IGroup є один істотний недолік - істотний порядок перерахування типів. Для усунення цієї особливості потрібно буде перерахувати в факторіал раз більше типів в спадкуванні IGroup. Тобто вказати не всі можливі поєднання типів, у кількості (N-1) з N, а їх всілякі розміщення. Розміщень (N-1) об'єктів з N можливих в (N-1)! раз більше, ніж поєднань.

Приклад коду для трьох параметрів:

Повний код прикладу наведено тут: http://codepad.org/ONI6uXjI

Звичайно ж, не варто писати код для IGroup з 5-ма і 6-ма параметрами вручну - необхідний скрипт для генерації цього тисячострокового коду. Для повноцінного використання не вистачає роботи з  поінтерами. Спробую днями, але мені здається проблем ніяких при кастуванні «розумних» покажчиків не буде.

UPDATE1:

Як було вірно помічено товаришами burdakovd і tangro в коментарях 1 і 2, в Java і .NET підтримка цього механізму є в Generics. Посилання на опис Java Generics і .NET Generics.

UPDATE2:

Користувач susl справедливо помітив у своєму коментарі, що в бібліотеці Boost є механізм Boost Concept Check, за що йому окреме спасибі.

UPDATE3:

Товариш Balthasar прояснив ситуацію щодо концептів у новому стандарті C++ 0x, а вірніше про їх відсутність. І навів посилання на слайди презентації Boost Concept Check. За що йому більше спасибі!