Комментарии 9
c шаблонами и нюансами надо быть аккуратным это точно, я тоже переписывая математику по началу решил сделать многое на шаблонах, и по началу было круто, а потом началось веселье (это то о чем я не знал), без включения каких либо библиотек всё работало гуд, как только включалось ASSIMP, плюс я пользуюсь vector/array из std и вот есть нюанс, при компиляции всего этого шаблонная математика не запускалась потомучто пересекалась с ассимп и с выделением памяти ) вобщем было весело, я сразу вспомнил цену С) и теперь даже не знаю что лучше С или С++ ), вобщем тысячи строк перекинул обратно в явные вещи, и теперь сразу скаканул до 3д анимаций вот теперь интерполяция ) и коррекция на изучении ) по ходу даже с инверс 3-4 матрицами разобрался и двойные кватернионы отдебажил, но чувствую вся математика может разбиться об интерполяцию и коррекцию )
я сразу вспомнил цену С) и теперь даже не знаю что лучше С или С++
так на С++ вроде можно и без шаблонов писать или нет? Как минимум не придется например какой нибудь unlock() вручную расставлять на все выходы из блока кода. Стандартные решения на шаблонах из библиотек вполне себе адекватны, не надо свои городить в библиотечном стиле когда вы пишите НЕ-библиотеку. В чем смысл шаблона если к нему надо писать спецификацию не совсем понятно, ведь спецификация по сути это отмена шаблонности.
бинарный протокол сообщений ... со своим генератором C++ кода
А зачем вообще в проекте на C++ кодогенерация? Шаблонов не хватило?
Как только я убрал тело базового шаблона и оставил лишь декларацию, компилятор тут же подсказал ошибкой, что специализации не хватает. Подключив правильный заголовок, я пересобрал код — и всё заработало!
А какой именно в итоге оказался "правильным"?
Статье очень сильно не хватает примеров кода, которые бы иллюстрировали происходящее.
// base.hpp (included)
template<typename T> void test(T value) { puts("default"); };
// specialized.hpp (forgot to include)
template<> void test(int value) { puts("specialized"); };
// main.cpp
#include <base.hpp>
int main(void) { test(1); } // default
Ну да, не очень тянет на "breaking news", но я могу представить проект, где это встретится. Аналогично с перегрузками (а это уже исправлял сам). Только если с перегрузками иногда можно поймать implicit double conversion флажками компилятора, то с шаблонами уже надо учиться писать fool-proof код лично.
Всегда ставлю static_assert
в базовый шаблон для отладочной версии приложения и не надо 3 дня думать над проблемой.
Для таких вот затей со специализациями и придумали extern template.
В Си можно легко выстрелить себе в ногу — твердят плюсовики. При этом сами так заигрались с метапрограммированием, что приходится дизасмить код и смотреть, что же там не так нагенерировалось...
Ошибка компилятора или неожиданный эффект шаблонов в C++?