Qraizer

Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору asi81, а в чём сложность? Код: bool isMyObj(const volatile MyObj&) { return true; } bool isMyObj(...) { return false; } | Правда этот код не справится с недоступным или неоднозначным наследованием, типа такого: Код: class MyObj{}; class A: protected MyObj{}; // недоступное class B: public MyObj{}; class C: public MyObj{}; class D: B, C{}; // неоднозначное A a; D d; isMyObj(a); isMyObj(d); | Будет ошибка компиляции. Также он не справится с классами, в которых есть перегруженный оператор приведения к (по всякому cv-квалифицированному) типу MyObj&. Только тут будет не ошибка компиляции, а ложный true. Если некритично, то юзай на здоровье. Однако эти недостатки можно исправить, немного сильно постаравшись. Добро пожаловать в метапрограммирование! Код: /* метафункция, возвращающая bool "D производный от B" */ template <typename D, typename B> class IsDerived { typedef char (&small_type)[1]; typedef char (&big_type) [2]; template <typename T> static small_type check(const volatile D&, T); static big_type check(const volatile B&, int); struct Proxy { operator const volatile B&() const; operator const volatile D&(); }; public: enum { value = sizeof(check(Proxy(), 0)) == 1 }; }; /* применяем к нашему частному стучаю */ template <template T> bool isMyObj(const T&) { return IsDerived<T, MyObj>::value; // вычисляется при компиляции, в run-time будет уже готовое true или false } |
---------- Одни с годами умнеют, другие становятся старше. |
| Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 04:04 30-08-2011 | Исправлено: Qraizer, 04:06 30-08-2011 |
|