на главную


Если про неявные преобразования не explicit конструкторов с одной переменной [1] ide не даст мне забыть, то про преобразование в обратную сторону [2] я узнал вот буквально только что


Довольно забавно, что корявые костыли из джуниорского прошлого оказываются валидной техникой, используемой в метапрограммировании:


Функциональное программирование в моих плюсАх, или как нельзя писать в продакшене. Но прикольно :)
Все затеяно ради строчки const Circle circle = Point().x(5).y(5).createCircle(10);


Давайте представим, что существует время. Оно состоит из двух частей: старшей, в миллисекундах, и младшей — в долях миллисекунды. И в разных проектах размерность младшей части разная: где-то поточней, где-то погрубей. Как раз хорошая возможность повозиться с std::chrono! К сожалению, только 11 стандарт, как всегда

Fractured Time


Вместо чтения бесконечных статей про выравнивание и подсчета sizeof-ов я мог просто проверить себя с помощью ptype /o от gdb :(

Скажем, для структуры
struct Tst
{
bool v1;
unsigned long long v2;
std::vector v3;
};

оно вернет


Оказывается, пользовательские литералы нельзя делать шаблонными, а ведь так хочется!


Захотелось сделать библиотечку для работы с конечными автоматами. Идея простая: на один шаг сложнее, чем switch--case. И куча шуток в названиях.

FateMachine


Неиспользуемые параметры функций добавляют предупреждений компилятора. В случаях, когда их прям много, или когда хочется довести код до состояния "0 предупреждений" можно использовать или, может, еще что-нибудь подобное. Но что-то как-то душа к этому не лежит. А можно последовать совету самого Кармака, и просто избавиться от имени переменной:

void foo(int /*arg*/){}


    Если
  1. объявить переменную константной
  2. убрать константность const_cast`ом
  3. попытаться изменить ее значение
на выходе получим undefined behavior

¯\_(ツ)_/¯