Rtti vs шаблонна магія

Ви хочете працюєте з об'єктами через покажчик на базовий клас IObject і хочете реалізувати isA за допомогою шаблонів. Це неможливо, так як інстанцірованія шаблонів відбувається в compile-time, а ініціалізація покажчиків на IObject відбувається в run-time. IObject передається за вказівником в якості аргументу в конструктор NamedObject, тому тип obj відомий тільки в run-time і без RTTI тут не обійтися.

Для початку, я думав про:

І про те, щоб зробити NamedObject НЕ обгорткою, а спадкоємцем і через це позбутися від своєї (iaA) обгортки на RTTI, і користуватися тільки dynamic_cast. Мінус в породженні купи класів NamedObject, і заодно в цьому випадку важко так легко перевірити, що клас є якимось із цих NamedObject, так що обгортка знову повертається. У загальному і цілому, я просто хочу знайти більш елегантне рішення, буде таке існує.

Природно, я розумію, що в будь-якому випадку доведеться застосовувати dynamic_cast, під «без RTTI», я мав на увазі не взагалі «без RTTI», а без своїх надбудов над ним, ну або хоча б з максимально простими надбудовами, або найбільш красивими. Загалом, це чисто дослідницький і естетичний інтерес, з точки зору працездатності поточна схема цілком влаштовує.

Беремо ідею, згадану посиланням в постах вище і робимо для неї приклад:

Для роботи такого каста потрібно успадкування від якогось інтерфейсу, але не будемо забувати, що dynamic_cast теж не безкоштовно працює, він вимагає плату віртуальністю, тобто ваш клас повинен хоч щось утримувати віртуальне, хоч деструктор, але тип повинен бути поліморфним.

Схожі статті