this->notes.
4.49K subscribers
56 photos
1 file
439 links
О разработке, архитектуре и C++.

Tags: #common, #cpp, #highload и другие можно найти поиском.
Задачки: #poll.
Мои публикации: #pub.
Автор и предложка: @vanyakhodor.
GitHub: dasfex.
Download Telegram
#cpp #poll
Предположим, имеем такой код:

int x(1);
new(&x) int(5);

Вызывает ли этот код undefined behaviour?
(можно пояснить свой ответ в комментариях 🙂 )
Ответ выложу завтра.
#poll
Есть ли тут какие-то проблемы? Можно обсудить в cumментариях. Завтра выложу ответ(если его никто не пробьёт).
#poll
Что нужно сделать, чтобы этот код скомпилировался?
В таком виде он выдаёт
use of undeclared identifier 'a'
Если никто не пробьёт, ответ через пару дней. Иначе ищите в комментариях : )

UPD: как оказалось, на некоторых компиляторах заработает простое добавление typename. Но для clang этого недостаточно, так что давайте будем компилировать с его помощью : )
#poll
Очевидно, варианта 4: TT, TS, ST, SS. Вы конечно можете скомпилить и ответить, но давайте ещё и с пояснениями : )
Как обычно, если никто не пробьёт за пару дней, то выложу ответ, но почему-то кажется, что вы замечательно справитесь!)
👍2
#poll
Использование variadic templates очевидно облегчает жизнь программистам. Однако бывают совсем экзотические свёртки с их участием. Давайте посмотрим на одну такую.

Имеем бинарное дерево на 1й картинке. И мы хотим заставить работать код на второй картинке. left/right -- указатели на члены класса(предлагаю объявить самим). Нужно написать функцию tree_get с помощью variadic templates(помним, что это C++17). Пишется она буквально в пару строк. В случае некорректного пути к несуществующей ноде можно падать. Тут есть код, который может вам пригодиться.

Как обычно, если никто не пробьёт за пару дней, то выложу ответ. Иначе ищите в комментариях.
👍2
this->notes.
#poll Использование variadic templates очевидно облегчает жизнь программистам. Однако бывают совсем экзотические свёртки с их участием. Давайте посмотрим на одну такую. Имеем бинарное дерево на 1й картинке. И мы хотим заставить работать код на второй картинке.…
#poll
Спасибо за ваши ответы : ) Правильное решение было, но моё немного отличается, потому предлагаю такое:

template<class T, class... Args>
Node<T>* tree_get(Node<T>* top, Args... args) {
return (top ->* ... ->* args);
}

auto left = &Node<int>::left;
auto right = &Node<int>::right;
👍1
#cpp #poll

Задача такая: выполнить какой-то код ровно один раз во время жизни нашей программы. Решение вполне понятное:

void init() {
static bool unused = [] {
std::cout << "print
ed once" << std::endl;
return true;
}();
}


При вызове такой функции сколько угодно раз вывод будет всегда один и тот же (даже из разных потоков, сможете ответить почему?):

printed once

А что, если я хочу вызвать какой-то код ровно n раз? Об этом и предлагаю вам подумать : )

Как обычно, если никто не пробьёт, ответ через пару дней.

UPD: хотелось бы увидеть решение руками, а не с чем-то вроде std::call_once (но ими всё равно можно поделиться :) ).
👍3❤1
this->notes.
#cpp #poll Задача такая: выполнить какой-то код ровно один раз во время жизни нашей программы. Решение вполне понятное: void init() { static bool unused = [] { std::cout << "printed once" << std::endl; return true; }(); } При вызове такой функции…
#cpp #poll

Дисклеймер.
Предвижу, как на меня выливаются вёдра помоев за такой солв, но он интерес
ен чисто с точки зрения языка и приёма, а не как что-то, что стоит юзать в жизни (собственно в оригинальном докладе так и говорится).

Вспомним, как работает этот код:

void init() {
static bool unused = [] {
std::cout << "printed once" << std::endl;
return true;
}();
}


Мы инициализируем статическую переменную. Во-первых, это всегда происходит атомарно (вот такой факт). Во-вторых, только один раз (пруфы на оба утверждения). В-третьих, есть вот такое утверждение:

If the initialization throws an exception, the variable is not considered to be initialized, and initialization will be attempted again the next time control passes through the declaration.

Возникает ужасная идея: поюзать исключения для контроля flow вашего кода (не делайте так пожалуйста). Так что можем сообразить что-то такое:

struct Throwed {};

constexpr int n = 3;

void init() {
try {
static bool unused = [] {
static int called = 0;
std::cout << "123" << std::endl;
if (++called < n) {
throw Throwed{};
}
return true;
}();
} catch (Throwed) {}
}


Как по мне, оч прикона.

Ещё можно найти такой факт:

If the initialization recursively enters the block in which the variable is being initialized, the behavior is undefined.

Никогда не задумывался об этом. Тож интересно.
👍16❤1