Size: a a a

2020 October 15

PS

Pavel Samolysov in pro.cxx
Получается ИДЕ завязывается только на одну систему сборки
источник

PS

Pavel Samolysov in pro.cxx
Ну вот clion завязали на две
источник

VK

Valentin Kornienko in pro.cxx
Pavel Samolysov
Получается ИДЕ завязывается только на одну систему сборки
Нет
источник

VK

Valentin Kornienko in pro.cxx
Обычно на свои проекты + симейк
источник

PS

Pavel Samolysov in pro.cxx
Ну вот некоторые только на смэйк
источник

m

magras in pro.cxx
А compile_commands.json не явлется универсальным мостом между ide и системой сборки?

upd: bazel не умеет в него из коробки, но есть воркараунды. Окей, гугл.
источник

ПК

Побитый Кирпич... in pro.cxx
Pavel Samolysov
Ну вот некоторые только на смэйк
Если есть норм система плагинов, то завязки нет. Просто для каких то систем "плагины" идут из коробки
источник

PS

Pavel Samolysov in pro.cxx
Я согласен с тем, что если хочешь популярности своей системе сборки изволь писать плагины под популярные иде
источник

АК

Александр Караев... in pro.cxx
Есть возможность реализовать раскрытие темплейт-пака (через fold expr, например) без рекурсии с аналогичным функционалом?

template <class... Ts>
auto foo(const Ts& ...ts) {
 // [i] - псевдокод
 if (Predicate(ts[0])) return F(ts[0]);
 if (Predicate(ts[1])) return F(ts[1]);
 ...
 if (Predicate(ts[sizeof...(Ts) - 1])) return F(ts[sizeof...(Ts) - 1]);
 return smth_default;
}


Суть в return.
источник

АК

Александр Караев... in pro.cxx
Пока что есть лишь решение с созданием временного std::optional<..> result;, что не очень устраивает
источник

Е

Егор in pro.cxx
Александр Караев
Есть возможность реализовать раскрытие темплейт-пака (через fold expr, например) без рекурсии с аналогичным функционалом?

template <class... Ts>
auto foo(const Ts& ...ts) {
 // [i] - псевдокод
 if (Predicate(ts[0])) return F(ts[0]);
 if (Predicate(ts[1])) return F(ts[1]);
 ...
 if (Predicate(ts[sizeof...(Ts) - 1])) return F(ts[sizeof...(Ts) - 1]);
 return smth_default;
}


Суть в return.
А вопрос в том как вернуть что-то дефолтное, или как сделать без рекурсии? Если второе то может так https://godbolt.org/z/ax3PWM?
источник

OZ

Olzhas Zhumabek in pro.cxx
Александр Караев
Есть возможность реализовать раскрытие темплейт-пака (через fold expr, например) без рекурсии с аналогичным функционалом?

template <class... Ts>
auto foo(const Ts& ...ts) {
 // [i] - псевдокод
 if (Predicate(ts[0])) return F(ts[0]);
 if (Predicate(ts[1])) return F(ts[1]);
 ...
 if (Predicate(ts[sizeof...(Ts) - 1])) return F(ts[sizeof...(Ts) - 1]);
 return smth_default;
}


Суть в return.
std::index_sequence + lambda?
источник

АК

Александр Караев... in pro.cxx
Olzhas Zhumabek
std::index_sequence + lambda?
код в студию!
лямбда здесь не поможет - она не может по одному условию вернуть значение, а по другому - пойти дальше обходить пак
источник

АК

Александр Караев... in pro.cxx
типы должны быть разные. рекурсии не должно быть
дефолтное значение я определяю сам, это не важно. пусть даже UB, если все вызовы предикатов вернули false
источник

Е

Егор in pro.cxx
Александр Караев
типы должны быть разные. рекурсии не должно быть
дефолтное значение я определяю сам, это не важно. пусть даже UB, если все вызовы предикатов вернули false
А предикат как разные типы принимает?
источник

АК

Александр Караев... in pro.cxx
Егор
А предикат как разные типы принимает?
очевидно - он шаблонный
источник

АК

Александр Караев... in pro.cxx
Можно поиграться вот с таким простеньким рекурсивным примером:

template <class T> constexpr bool Predicate(const T& value) { return value > 0; }

template <class T> constexpr auto F(const T& value) { return sizeof(T); }

template <class T, class... Ts>
constexpr auto foo(const T& t, const Ts& ...ts) {
   if (Predicate(t)) return F(t);
   if constexpr (sizeof...(ts) > 0) {
       return foo(ts...);
   }
   // UB here
}

static_assert(foo(-1, -1.0f, 10, true) == sizeof(int));

Predicate и F глобальные для упрощения. Задача - сделать без рекурсии
источник

АК

Александр Караев... in pro.cxx
Реализация с лямбдой, optional и без рекурсии:

#include <optional>

template <class... Ts>
constexpr auto foo2(const Ts& ...ts) {
   std::optional<decltype(F(0))> result;

   auto l = [&](const auto& t) {
       if (!result && Predicate(t))
           result = F(t);
   };
   (l(ts), ...);
   
   return result.value();
}
источник

ПК

Побитый Кирпич... in pro.cxx
Александр Караев
Можно поиграться вот с таким простеньким рекурсивным примером:

template <class T> constexpr bool Predicate(const T& value) { return value > 0; }

template <class T> constexpr auto F(const T& value) { return sizeof(T); }

template <class T, class... Ts>
constexpr auto foo(const T& t, const Ts& ...ts) {
   if (Predicate(t)) return F(t);
   if constexpr (sizeof...(ts) > 0) {
       return foo(ts...);
   }
   // UB here
}

static_assert(foo(-1, -1.0f, 10, true) == sizeof(int));

Predicate и F глобальные для упрощения. Задача - сделать без рекурсии
template <typename T, typename R>
void if_template(const T& t, R& return_slot, bool& go_next) {
 if (go_next && Predicate(t)) { return_slot = F(t); go_next = false; }
}

template <class... Ts>
constexpr auto foo(const Ts& ...ts) {
   some_deduced_type return_slot;
   bool go_next = true;
   if_template(ts,  return_slot, go_next), ...;
   return return_slot;
}

Что то такое пришло в голову, тут осталось вывести some_deduced_type, ну и у него появилось требование default-constructible
источник

АК

Александр Караев... in pro.cxx
Побитый Кирпич
template <typename T, typename R>
void if_template(const T& t, R& return_slot, bool& go_next) {
 if (go_next && Predicate(t)) { return_slot = F(t); go_next = false; }
}

template <class... Ts>
constexpr auto foo(const Ts& ...ts) {
   some_deduced_type return_slot;
   bool go_next = true;
   if_template(ts,  return_slot, go_next), ...;
   return return_slot;
}

Что то такое пришло в голову, тут осталось вывести some_deduced_type, ну и у него появилось требование default-constructible
я optional завёл как раз для того, чтобы не требовать default-constructible :)
источник