История изменений
Исправление 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 ещё нескольких типов».