Templates и generic-техники C
Templates генерируют type-safe реализацию; C применяет macros, void* или C11 _Generic.
Что такое Templates и generic-техники C?
Templates генерируют type-safe реализацию; C применяет macros, void* или C11 _Generic.
Пишите независимый от типа compile-time код.
Важные моменты
- Сначала поймите механизм на C.
- Используйте RAII и value semantics для ownership.
- Предпочитайте type-safe абстракции макросам и cast.
Примеры кода на C и C++
main.c
#include <stdio.h>
int max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
#define MAX(left, right) _Generic((left), \
int: max_int, double: max_double)((left), (right))
int main(void) {
printf("%d %.1f\n", MAX(3, 9), MAX(2.5, 7.0));
}
9 7.0
C++
main.cpp
#include <iostream>
template<class T>
T maximum(const T& left, const T& right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 9) << ' '
<< maximum(2.5, 7.0) << '\n';
}
9 7
Сравнение C и C++
_Generic перечисляет типы; template C++ работает с любым типом, предоставляющим необходимые операции.
C
C использует префиксы, callbacks, макросы и context-структуры.
C++
Язык предоставляет scoped и type-safe абстракции.
Практические задания
Запустите обе версии и изменяйте их, сравнивая гарантии языков.
- Сначала напишите механизм на C.
- Замените ручную очистку на RAII.
- Измерьте allocation и virtual dispatch.