#poll
Есть ли тут какие-то проблемы? Можно обсудить в cumментариях. Завтра выложу ответ(если его никто не пробьёт).
Есть ли тут какие-то проблемы? Можно обсудить в cumментариях. Завтра выложу ответ(если его никто не пробьёт).
#poll
Что нужно сделать, чтобы этот код скомпилировался?
В таком виде он выдаёт
Если никто не пробьёт, ответ через пару дней. Иначе ищите в комментариях : )
UPD: как оказалось, на некоторых компиляторах заработает простое добавление typename. Но для clang этого недостаточно, так что давайте будем компилировать с его помощью : )
Что нужно сделать, чтобы этот код скомпилировался?
В таком виде он выдаёт
use of undeclared identifier 'a'Если никто не пробьёт, ответ через пару дней. Иначе ищите в комментариях : )
UPD: как оказалось, на некоторых компиляторах заработает простое добавление typename. Но для clang этого недостаточно, так что давайте будем компилировать с его помощью : )
#poll
Очевидно, варианта 4: TT, TS, ST, SS. Вы конечно можете скомпилить и ответить, но давайте ещё и с пояснениями : )
Как обычно, если никто не пробьёт за пару дней, то выложу ответ, но почему-то кажется, что вы замечательно справитесь!)
Очевидно, варианта 4: TT, TS, ST, SS. Вы конечно можете скомпилить и ответить, но давайте ещё и с пояснениями : )
Как обычно, если никто не пробьёт за пару дней, то выложу ответ, но почему-то кажется, что вы замечательно справитесь!)
👍2
#poll
Использование variadic templates очевидно облегчает жизнь программистам. Однако бывают совсем экзотические свёртки с их участием. Давайте посмотрим на одну такую.
Имеем бинарное дерево на 1й картинке. И мы хотим заставить работать код на второй картинке. left/right -- указатели на члены класса(предлагаю объявить самим). Нужно написать функцию tree_get с помощью variadic templates(помним, что это C++17). Пишется она буквально в пару строк. В случае некорректного пути к несуществующей ноде можно падать. Тут есть код, который может вам пригодиться.
Как обычно, если никто не пробьёт за пару дней, то выложу ответ. Иначе ищите в комментариях.
Использование 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
Задача такая: выполнить какой-то код ровно один раз во время жизни нашей программы. Решение вполне понятное:
При вызове такой функции сколько угодно раз вывод будет всегда один и тот же (даже из разных потоков, сможете ответить почему?):
А что, если я хочу вызвать какой-то код ровно n раз? Об этом и предлагаю вам подумать : )
Как обычно, если никто не пробьёт, ответ через пару дней.
UPD: хотелось бы увидеть решение руками, а не с чем-то вроде std::call_once (но ими всё равно можно поделиться :) ).
Задача такая: выполнить какой-то код ровно один раз во время жизни нашей программы. Решение вполне понятное:
void init() {
static bool unused = [] {
std::cout << "printed 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
Вспомним, как работает этот код:
Мы инициализируем статическую переменную. Во-первых, это всегда происходит атомарно (вот такой факт). Во-вторых, только один раз (пруфы на оба утверждения). В-третьих, есть вот такое утверждение:
Возникает ужасная идея: поюзать исключения для контроля flow вашего кода (не делайте так пожалуйста). Так что можем сообразить что-то такое:
Как по мне, оч прикона.
Ещё можно найти такой факт:
Никогда не задумывался об этом. Тож интересно.
Дисклеймер.
Предвижу, как на меня выливаются вёдра помоев за такой солв, но он интересен чисто с точки зрения языка и приёма, а не как что-то, что стоит юзать в жизни (собственно в оригинальном докладе так и говорится). Вспомним, как работает этот код:
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