Несколько рандомных фактов.
1. Посмотрим на такой код:
struct Kek { int lol; int kek; };std::vector<Kek> keks;
for (const auto& [lol, kek] : keks) {
[=] { std::cout << lol << "\n"; }();
}Неожиданно, он не скомпилируется. Не скомпилируется он на моменте обращения к переменной
lol в лямбде. Странно, да?🤔На самом деле переменные из structure binding не умеют захватываться в лямбды (это, стоит надеяться, временно). Немножко пояснений можно посмотреть тут.
Кстати примерно из-за этого же structure binding становится пацаном довольно неровным, потому что начинает ломать всякое NRVO. Будьте аккуратны.
2. Попался один интересный доклад на CppCon 2016 про оптимизацию вашего кода. Автор предлагал использовать принцип DRY не только в случае написания кода, но и с шаблонами:
struct B {
virtual ~B() = default;
};
template <typename T>
struct D : B {
std::vector<int> get() const { return m_v; }
std::vector<int> m_v;
};Учитывая, что для каждого инстанцирования код класса по факту будет копироваться, стоит вынести всё что можно в базовый класс:
struct B {
virtual ~B() = default;
virtual std::vector<int> get() const { return m_v; }
std::vector<int> m_v;
};
template <typename T>
struct D : B {};Так сказать взгляд с другой стороны.
Посмотрите доклад. Там прикона : )
3. При использовании
std::function<void(args...)> (с возвращаемым типом void) к такому объекту можно кастовать любой функтор с такими же аргументами, но любым возвращаемым типом. То есть вот такое будет компилироваться:std::function<void()> f{[] -> int {return 1;}};Руками полезность этой фичи я пока не ощутил, но говорят, что бывает удобно, когда хочешь показать пользователю, что некоторая функция не использует возвращаемое значение/в схемах с коллбеками и подобном.
И ещё немного ссылочек на выходные:
0. Интересный доклад о переписывании базы данных личных сообщений в Вк.
1. Обзорный доклад про очереди в highload.
2. Статья про то, как важно уметь отказываться от уже сделанного.
3. Удобное сокращение для стандартных стримов в C++: https://github.com/vitaut/_._ (sorry).
4. Статья про некоторые отличия в реализациях частей C++ от разных компиляторов.
5. Новый формат QOI (qoiformat.org), который неплохо сжимает картинки, на уровне PNG, но при этом в десятки раз быстрее, а его спецификация -- одна страница.