А шаблоны, несмотря на ряд косяков (синтаксис, отсутствие раздельной компиляции),
> позволяют делать с одной стороны достаточно высокуровневый, а с другой стороны,
> оптимизированный код.Должен признать, С++ (но только на самом новом GCC) может кое-что, чего не может Си:
заполнять секцию данных (имеется ввиду большой и сложный массив) из кода с помощью constexpr и пары шаблонов. Из-за этого в коде Си можно встретить огромные заранее посчитанные массивы. Иногда они генерируются каким-нибудь скриптом на этапе сборки. Но всё же, было бы неплохо делать это компилятором. В случае С++, замечу, тоже не так уж удобно, и (на сегодняшний день) мало чем можно такое собрать.
Вот простейший пример кода:
http://coliru.stacked-crooked.com/a/944b535a8131ab77
(секцию данных можно проверить, указан компиляции -O3 -S main.s && cat main.s)
Обсуждение вопроса было здесь:
https://toster.ru/answer?answer_id=949231
Что касается простых шаблонных функций, на Си они легко делаются так:
- создал файл func.h, и записал туда
FUNC_DECL
{
// common code...
TYPE tralala;
#ifdef F_CASE1
// unique code
#endif
#ifdef F_CASE2
// unique code
#endif
// common code...
}
#undef F_CASE1
#undef F_CASE2
#undef FUNC_NAME
потом, там, где нужно нагенерить функций, просто инклудишь файл несколько раз:
#define FUNC_NAME int abc(int * a, int * b)
#define F_CASE1 1
#include func.h
#define FUNC_NAME int abc2(int * a, int * b)
#define F_CASE2 1
#include func.h
По такому шаблону можно ходить в отладчиках, как VS, так и gdb.
Кто-то скажет "фу, препроцессор", а на мой взгляд здесь всё гораздо лучше чем в темплейтах:
- потому что процесс генерации прозрачен и понятен.
- тут не нужно вспоминать тонкости синтаксиса, минимальное кол-во боли при ревизии.
- самое важное: гибкость. Можно нагенерить любую идею. В темплейтах не так. Можно абстрагироваться от типов, но если функции должны отличаться уникальными кусками кода (как в этом примере), что, замечу, ТРИВИАЛЬНЫЙ СЛУЧАЙ, тогда в С++ требуется создавать вспомогательные шаблонные классы.
- соберётся любой версией компилятора на любом железе.
Короче, препроцессор - это свобода.