Size: a a a

2020 May 12

AZ

Alexander Zaitsev in pro.cxx
Ilia Zviagin
а ... не? Не катят?
нет, не катит
источник

ПК

Побитый Кирпич... in pro.cxx
Alexander Zaitsev
Есть функция:
template<typename ResultType, typename ExceptionType, typename FunctionType>
inline ResultType RetryOnAnyException(FunctionType func)
{
   for (;;)
   {
       try
       {
           return func();
       }
       catch (ExceptionType const& e)
       {
       }
   }
}

Хотелось бы сделать так, чтобы туда можно было передавать несколько ExceptionType (в идеале variadic template) и чтобы все переданные исключения отлавливались. Как это сделать, не засовывая исключения в одну иерархию?

Естественно, что я не хочу писать варианты для 2-3-4-N типов исключений руками
Если они хотя бы все наследуют std::exception, то можно динамик кастом пройтись просто по списку типов
источник

CD

Constantine Drozdov in pro.cxx
Alexander Zaitsev
Есть функция:
template<typename ResultType, typename ExceptionType, typename FunctionType>
inline ResultType RetryOnAnyException(FunctionType func)
{
   for (;;)
   {
       try
       {
           return func();
       }
       catch (ExceptionType const& e)
       {
       }
   }
}

Хотелось бы сделать так, чтобы туда можно было передавать несколько ExceptionType (в идеале variadic template) и чтобы все переданные исключения отлавливались. Как это сделать, не засовывая исключения в одну иерархию?

Естественно, что я не хочу писать варианты для 2-3-4-N типов исключений руками
там скажем
template <typename FunctionType, typename... Exceptions>
struct caller;

template <typename FunctionType, typename Exception1, typename... ExceptionsLeft>
struct caller<Exception1, ExceptionsLeft...> : caller<FunctionType, ExceptionsLeft...> {
   operator (FunctionType func) {
       try {
           return __super::operator()(std::forward<>());
       }
       catch (Arg1 const&) {
       }
};
template<FunctionType>
struct caller<FunctionType> {
}
источник

CD

Constantine Drozdov in pro.cxx
Artöm Bakri Al-Sarmini
Используете флаг /permissive- в продакшене?
(прошу не участвовать в опросе, если проект не таргетит винду или если вы школьник)
Анонимный опрос
31%
Да
41%
Нет
28%
Что это? (скорее всего да)
Проголосовало: 32
А где вариант "нет, но в 20 перепишем шаблончики и будем"?
источник

CD

Constantine Drozdov in pro.cxx
Alexander Zaitsev
нет, не катит
А заставить функцию variant возвращать вместо исключения?)))
источник

AZ

Alexander Zaitsev in pro.cxx
Constantine Drozdov
А заставить функцию variant возвращать вместо исключения?)))
неа
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Constantine Drozdov
А где вариант "нет, но в 20 перепишем шаблончики и будем"?
Сейчас то нет
источник

CD

Constantine Drozdov in pro.cxx
Artöm Bakri Al-Sarmini
Сейчас то нет
Хотя я не проверял, там super и if_exist же не забанят?
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Вряд ли
источник

AZ

Alexander Zaitsev in pro.cxx
хочу покурить в сторону какого-нибудь Boost.Preprocessor
источник

CD

Constantine Drozdov in pro.cxx
Alexander Zaitsev
хочу покурить в сторону какого-нибудь Boost.Preprocessor
Ну макросом изи, но вроде с рекурсией компилер тебя поймет
источник

CD

Constantine Drozdov in pro.cxx
Там просто BOOST_PP_FOR_EACH да
источник

AD

Andrey Davydov in pro.cxx
Alexander Zaitsev
Есть функция:
template<typename ResultType, typename ExceptionType, typename FunctionType>
inline ResultType RetryOnAnyException(FunctionType func)
{
   for (;;)
   {
       try
       {
           return func();
       }
       catch (ExceptionType const& e)
       {
       }
   }
}

Хотелось бы сделать так, чтобы туда можно было передавать несколько ExceptionType (в идеале variadic template) и чтобы все переданные исключения отлавливались. Как это сделать, не засовывая исключения в одну иерархию?

Естественно, что я не хочу писать варианты для 2-3-4-N типов исключений руками
Я бы тоже делал рекурсивно, как @webreh предлагает, но только зачем классы понадобились не знаю:
template<typename ResultType, typename FunctionType>
auto make_handler(FunctionType func) {
   return func;
};

template<typename ResultType, typename FirstExceptionType, typename... ExceptionTypes, typename FunctionType>
auto make_handler(FunctionType func) {
   return [func = make_handler<ResultType, ExceptionTypes...>(func)] {
       for (;;) {
           try
           {
               return func();
           }
           catch (FirstExceptionType const& e)
           {
           }
       }
   };
};

template<typename ResultType, typename... ExceptionTypes, typename FunctionType>
inline ResultType RetryOnAnyException(FunctionType func)
{
   auto handler = make_handler<ResultType, ExceptionTypes...>(func);
   return handler();
}
источник

AD

Andrey Davydov in pro.cxx
источник

ЯФ

Ярослав Фриш... in pro.cxx
Есть живые?
источник

ЯФ

Ярослав Фриш... in pro.cxx
Класс
источник

ЯФ

Ярослав Фриш... in pro.cxx
Кто нибудь шарит за работу с окнами, на низких уровнях?
источник

AK

Anton Kviatkovskii in pro.cxx
Ярослав Фриш
Кто нибудь шарит за работу с окнами, на низких уровнях?
Сразу вопрос задавай
источник

ЯФ

Ярослав Фриш... in pro.cxx
Конкретного вопроса нет, их масса
источник

ЯФ

Ярослав Фриш... in pro.cxx
Сейчас попробую как нибудь в краце
источник