б) ничего страшного, если для символа FF получится при шифровании 0, ведь вы никак не ориентируетесь при получении длины строки на завершающий ноль, длина строки вам всегда известна. Тем более, при других способах шифрования вы никак не гарантируете, что не получится ноль, да и не нужно за этим тут следить.
1) в encoder SIZE — размер массива с завершающим нулем, то есть достаточно хранить SIZE байтов, а не SIZE+1
2) encoded.s[SIZE] = 0 — явный выход за границу массива
3) тут много ошибок работы с окончанием строки, например, push_back нуля в std::string делать нельзя, для него это нормальное значение, то есть нужно так:
td::transform(s, s + SIZE - 1, ...
небольшие замечания:
а) sizeCalculate — совсем лишний, если переписать encoder так:
template<typename T, std::size_t SIZE>
constexpr auto encoder(const T (&str)[SIZE])
б) почему для буфера был выбран short вместо char?
в) не силен в с++11, но, по-моему, можно указать значение по умолчанию и не описывать конструктор:
Итераторы должны оставаться валидными при удалении других элементов — std::list
Не только std::list, например, set, multiset, map, multimap обладают этим же свойством, а deque обладает этим свойством только при удалении.
А так согласен, одна схема не поможет, нужно четко понимать контейнеры.
Кстати, если вы создали для этого специальный макрос, то это подразумевает его повторное использование. Но если использовать ваш макрос второй раз в том же коде, это приведёт к конфликту объявляемых имён. Лучше не выносить такие вещи в макрос, а просто писать как есть.
а) не, мой способ нагляднее, а ваш избыточен :)
б) ничего страшного, если для символа FF получится при шифровании 0, ведь вы никак не ориентируетесь при получении длины строки на завершающий ноль, длина строки вам всегда известна. Тем более, при других способах шифрования вы никак не гарантируете, что не получится ноль, да и не нужно за этим тут следить.
1) в encoder SIZE — размер массива с завершающим нулем, то есть достаточно хранить SIZE байтов, а не SIZE+1
2) encoded.s[SIZE] = 0 — явный выход за границу массива
3) тут много ошибок работы с окончанием строки, например, push_back нуля в std::string делать нельзя, для него это нормальное значение, то есть нужно так:
небольшие замечания:
а) sizeCalculate — совсем лишний, если переписать encoder так:
б) почему для буфера был выбран short вместо char?
в) не силен в с++11, но, по-моему, можно указать значение по умолчанию и не описывать конструктор:
Не только std::list, например, set, multiset, map, multimap обладают этим же свойством, а deque обладает этим свойством только при удалении.
А так согласен, одна схема не поможет, нужно четко понимать контейнеры.
Пример объявления не константной глобальной переменной, доступной через вызов функции, который широко используется при создании синглтонов.
Вот это смущает, почему нельзя всё это инициализировать просто при первом обращении к библиотеке?
habrahabr.ru/post/124963/
Использование: