вместо:
struct I { virtual void foo() { /* nothing */ } };
struct A : I { void foo() final { /* impl */ } };
struct B : I { /* no foo */ };
Иметь
struct A { void foo() { /* impl */ } };
struct B { /* no foo */ };
Я могу отличить A от B, проверив статически наличие void foo(), но есть нюанс - нет аналога final/override. То есть, если я ошибусь в сигнатуре функции или опечатаюсь в названии, компилятор меня не поправит. Есть способ решить эту проблему? Я думал в сторону каких-нибудь варнингов, которые будут реагировать на неиспользуемый метод. Компилятор - gcc.
аккуратно упомяну паттерн CRTP. не уверен, что он решит проблему, но можете в ту сторону посмотреть
придется ждать метаклассы) https://www.youtube.com/watch?v=drt3yXI-fqk
Аналог финала я помню хотел как бумажку в ИСО оформить
в голову пришла идея - завести в базовом классе в приватной части структуры-теги, и делать каждый такой тег доступным для использования только в одном методе наследника. тогда если происходит попытка переопределения метода с другим именем или сигнатурой то будет ошибка компиляции. потребует CRTP и я не уверен что "делать каждый такой тег доступным для использования только в одном методе наследника" вообще реализуемо, возможно у вас получится развить идею
Полиморфизм то где? Если у тебя полиморфизм на шаблонах (статический), то там всё просто. Если при интанцировании и использовании не будет такого метода, то не скомпилируется.
С точки зрения статического полиморфизма произошедшее не является ошибкой, но факт "наследования" ты просто указываешь через static_assert
Короче, или static_assert что foo есть, равносильный ": I" у тебя провалится, или пиши новый пример
Обсуждают сегодня