LINUX.ORG.RU

История изменений

Исправление arturianec100, (текущая версия) :

В рамках «не скриптуха» по царю - не знаю. В рамках Си с классами - виртуальные методы и «наследование интерфейса». В рамках шаблонов С++:

template <typename T>
void draw(T* self) {
    static_assert(false, "Draw function wasn't implemented for type T");
}
...
struct Type1 { ... }

template <>
void draw<Type1>(Type1* self) { /*function body*/ }
...
struct Type2 { ... }

template <>
void draw<Type2>(Type2* self) { /*function body*/ }
...
void f() {
    draw(my_data); /* Для каждого типа вызовет свой
                      подходящий экземпляр draw или
                      стандартный, который не позволит
                      программе скомпилироваться */
}

Инклудить все template <> нужно строго до первого вызова draw.

Даже в контексте ВП сделает диаграммы, где вызывается draw, в разы компактнее и сильно упрощает рефакторинг вида «теперь можно draw ещё нескольких типов».

Исходная версия arturianec100, :

В рамках «не скриптуха» по царю - не знаю. В рамках Си с классами - виртуальные методы и «наследование интерфейса». В рамках шаблонов С++:

template <typename T>
void draw(T* self) {
    static_assert(false, "Draw function wasn't implemented for type T");
}
...
struct Type1 { ... }

template <>
void draw<Type1>(Type1* self) { /*function body*/ }
...
struct Type2 { ... }

template <>
void draw<Type2>(Type2* self) { /*function body*/ }
...
void f() {
    draw(my_data); /* Для каждого типа вызовет свой
    подходящий экземпляр draw или стандартный,
    который не позволит программе скомпилироваться */
}

Инклудить все template <> нужно строго до первого вызова draw.

Даже в контексте ВП сделает диаграммы, где вызывается draw в разы компактнее и сильно упрощает рефакторинг вида «теперь можно draw ещё нескольких типов».