Size: a a a

2020 August 19

SN

Syrovatnikov Nikita in supapro.cxx
К сожалению pastebin не работает( Так сойдет?

template <class _Callable, typename... _Args>
void callInMainContext(_Callable&& __f, _Args&&... __args) {
   std::tuple<_Args...> _args = std::tuple<_Args...>(std::forward<_Args>(__args)...);
   typedef std::pair<_Callable, std::tuple<_Args...>> cbParam_T;
   cbParam_T* cbParam = new cbParam_T(std::forward<_Callable>(__f), _args);

   // Args: ThreadFN, ThreadArg, ThreadFinishedFn
   createThread([](void* argsp){
       cbParam_T* arg = reinterpret_cast<cbParam_T*>(argsp);
       // Вот тут все плохо arg->first=nullptr
       call(arg->first, arg->second);

   }, cbParam, [](void* argsp){
       cbParam_T* arg = reinterpret_cast<cbParam_T*>(argsp);
       delete arg;
   });
}
источник

SN

Syrovatnikov Nikita in supapro.cxx
Переслано от Побитый Кирпич...
Лучше код скинь
источник

C

CodeDetector in supapro.cxx
Syrovatnikov Nikita
К сожалению pastebin не работает( Так сойдет?

template <class _Callable, typename... _Args>
void callInMainContext(_Callable&& __f, _Args&&... __args) {
   std::tuple<_Args...> _args = std::tuple<_Args...>(std::forward<_Args>(__args)...);
   typedef std::pair<_Callable, std::tuple<_Args...>> cbParam_T;
   cbParam_T* cbParam = new cbParam_T(std::forward<_Callable>(__f), _args);

   // Args: ThreadFN, ThreadArg, ThreadFinishedFn
   createThread([](void* argsp){
       cbParam_T* arg = reinterpret_cast<cbParam_T*>(argsp);
       // Вот тут все плохо arg->first=nullptr
       call(arg->first, arg->second);

   }, cbParam, [](void* argsp){
       cbParam_T* arg = reinterpret_cast<cbParam_T*>(argsp);
       delete arg;
   });
}
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
источник

VS

Vladimir Suisei in supapro.cxx
Liber Azerate
Нет, это юзабельная вещь, просто в особых случаях. Так сказать, ответный вопрос: когда ты в последний раз пользовался битовыми полями?
Когда писал на си и нужны были флаги)
источник

LA

Liber Azerate in supapro.cxx
Vladimir Suisei
Когда писал на си и нужны были флаги)
Неплохо :)
источник

VS

Vladimir Suisei in supapro.cxx
Liber Azerate
Неплохо :)
По сути поля - это сахар чтобы не писать кучу дефайнов со сдвигами
источник

АК

Александр Караев... in supapro.cxx
Syrovatnikov Nikita
К сожалению pastebin не работает( Так сойдет?

template <class _Callable, typename... _Args>
void callInMainContext(_Callable&& __f, _Args&&... __args) {
   std::tuple<_Args...> _args = std::tuple<_Args...>(std::forward<_Args>(__args)...);
   typedef std::pair<_Callable, std::tuple<_Args...>> cbParam_T;
   cbParam_T* cbParam = new cbParam_T(std::forward<_Callable>(__f), _args);

   // Args: ThreadFN, ThreadArg, ThreadFinishedFn
   createThread([](void* argsp){
       cbParam_T* arg = reinterpret_cast<cbParam_T*>(argsp);
       // Вот тут все плохо arg->first=nullptr
       call(arg->first, arg->second);

   }, cbParam, [](void* argsp){
       cbParam_T* arg = reinterpret_cast<cbParam_T*>(argsp);
       delete arg;
   });
}
tuple из ссылок (висячих)
источник

SN

Syrovatnikov Nikita in supapro.cxx
А можно как-то сделать tuple с глубоким копированием?
источник

АК

Александр Караев... in supapro.cxx
Syrovatnikov Nikita
А можно как-то сделать tuple с глубоким копированием?
принимай всё по значению и мувай =)
источник

АК

Александр Караев... in supapro.cxx
с учетом того, что в этой задаче идёт передача владения (как Callable, так и аргументов), это наиболее оптимальный и корректный вариант
источник

SN

Syrovatnikov Nikita in supapro.cxx
А избежать лишнего копирования при непосредственно вызове callInMainContext
источник

АК

Александр Караев... in supapro.cxx
Syrovatnikov Nikita
А избежать лишнего копирования при непосредственно вызове callInMainContext
если ты передаёшь ссылку в поток - тебе надо скопировать объект (иначе будет висеть)
если временный объект - смувать

вывод - можно сразу принимать по значению и мувать, результат будет одинаковый
источник

АК

Александр Караев... in supapro.cxx
это типичный случай вида "а какой конструктор писать для struct A { std::string b; }"
источник

M

Maksim in supapro.cxx
Побитый Кирпич
std::string::find_first_not_of
Спасибо. Я сейчас проверил, не подходит.
источник

SN

Syrovatnikov Nikita in supapro.cxx
Я немножко из СИ и наверное не до конца понимаю.
Стек ведь умрет сразу после выхода из функции callInMainContext, и аргументы, даже если переданы по значеню "умрут" вместе со стеком, следовательно передавать через rvalue ссылку целесообразнее, ведь нет гарантий что поток создастся до выхода из callInMainContext. Но как скопировать объект который лежит по этой rvalue ссылке в tuple и pair. Если я что-то не так понимаю, поправьте пожалуйста.
источник

M

Maksim in supapro.cxx
Побитый Кирпич
std::string::find_first_not_of
Знаете как. Например, есть строка str = "474774". Надо именно проверить есть ли в такой строке другие числа, кроме 4 и 7.
источник

АК

Александр Караев... in supapro.cxx
Syrovatnikov Nikita
Я немножко из СИ и наверное не до конца понимаю.
Стек ведь умрет сразу после выхода из функции callInMainContext, и аргументы, даже если переданы по значеню "умрут" вместе со стеком, следовательно передавать через rvalue ссылку целесообразнее, ведь нет гарантий что поток создастся до выхода из callInMainContext. Но как скопировать объект который лежит по этой rvalue ссылке в tuple и pair. Если я что-то не так понимаю, поправьте пожалуйста.
аргументы, переданные по значению, будут смуваны в pair, ничего не умрёт раньше времени
источник

АК

Александр Караев... in supapro.cxx
и да, в том контексте Callable&& - это не rvalue reference, а forwarding reference
источник

LA

Liber Azerate in supapro.cxx
Maksim
Знаете как. Например, есть строка str = "474774". Надо именно проверить есть ли в такой строке другие числа, кроме 4 и 7.
#include <iostream>

int main(int argc, char *argv[])
{
std::string pattern{ "47" };
std::string to_find{ "474744776" };

std::cout << to_find[to_find.find_first_not_of(pattern)];
}
источник

M

Maksim in supapro.cxx
Liber Azerate
#include <iostream>

int main(int argc, char *argv[])
{
std::string pattern{ "47" };
std::string to_find{ "474744776" };

std::cout << to_find[to_find.find_first_not_of(pattern)];
}
Спасибо огромное!
источник