Size: a a a

cxx.Дискуссионная

2020 March 18

Е

Егор in cxx.Дискуссионная
не, норм, компилит
источник

Е

Егор in cxx.Дискуссионная
Егор
class S : crtp<S> {
using type = crtp<crtp<S>>;
}
а, так тут и рекурсии нет
источник

O

Ofee in cxx.Дискуссионная
Егор
а, так тут и рекурсии нет
Да, рекурсию он не может, invalid use of incomplete type
источник

Е

Егор in cxx.Дискуссионная
Ofee
Да, рекурсию он не может, invalid use of incomplete type
это обойти через this_type можно
источник

Е

Егор in cxx.Дискуссионная
источник

O

Ofee in cxx.Дискуссионная
Псевдокод, не знаю, что дальше с этим делать. Index должен вычисляться на лупхолах через table::find_t, но я всё...

template<typename Tuple, typename Index = table::value<1>, typename = std::enable_if_t<!table::map_contains<Index>::value>, typename = void>
constexpr auto variadic(Tuple)  -> std::size_t {
   using type = decltype(std::get<Index>(Tuple{}));
   return (table::map<type, void>, Index::value);
};

template<typename Tuple, typename Index = table::value<1>, typename = std::enable_if_t<table::map_contains<Index>::value>>
constexpr auto variadic(Tuple) -> std::size_t {
   return variadic<Tuple, Index::value + 1>();
};


using must_be_autogenerated = std::tuple<table::value<1>, table::value<2>, table::value<3>, table::value<4>>;
static_assert(variadic(must_be_autogenerated{}) == 1);
static_assert(variadic(must_be_autogenerated{}) == 2);
// oops
источник

Е

Егор in cxx.Дискуссионная
господь бог я думал ты спишь
источник

Е

Егор in cxx.Дискуссионная
у тебя какой часовой пояс вообще?
источник

O

Ofee in cxx.Дискуссионная
Егор
господь бог я думал ты спишь
Уснёшь тут...
источник

O

Ofee in cxx.Дискуссионная
Егор
у тебя какой часовой пояс вообще?
У меня... довольно поздно...
источник

Е

Егор in cxx.Дискуссионная
Ofee
Псевдокод, не знаю, что дальше с этим делать. Index должен вычисляться на лупхолах через table::find_t, но я всё...

template<typename Tuple, typename Index = table::value<1>, typename = std::enable_if_t<!table::map_contains<Index>::value>, typename = void>
constexpr auto variadic(Tuple)  -> std::size_t {
   using type = decltype(std::get<Index>(Tuple{}));
   return (table::map<type, void>, Index::value);
};

template<typename Tuple, typename Index = table::value<1>, typename = std::enable_if_t<table::map_contains<Index>::value>>
constexpr auto variadic(Tuple) -> std::size_t {
   return variadic<Tuple, Index::value + 1>();
};


using must_be_autogenerated = std::tuple<table::value<1>, table::value<2>, table::value<3>, table::value<4>>;
static_assert(variadic(must_be_autogenerated{}) == 1);
static_assert(variadic(must_be_autogenerated{}) == 2);
// oops
а что ты возвразаешь в первом?
источник

Е

Егор in cxx.Дискуссионная
или ты инстанцируешь и возвращаешь значение по индексу?
источник

O

Ofee in cxx.Дискуссионная
Егор
а что ты возвразаешь в первом?
Числовое значение Index. Это просто тег над size_t
источник

Е

Егор in cxx.Дискуссионная
не, меня просто скобки круглые смущают, оператор запятая непонятная вещь
источник

O

Ofee in cxx.Дискуссионная
Ofee
Числовое значение Index. Это просто тег над size_t
Там не void регистрировать нужно, а генерировать цепочку...
источник

O

Ofee in cxx.Дискуссионная
Егор
не, меня просто скобки круглые смущают, оператор запятая непонятная вещь
Я просто намучился чуть раньше с тем, что компиляторы выкидывают table::map<type, void> в любой непонятной ситуации, так что я это одним выражением сделал
источник

Е

Егор in cxx.Дискуссионная
а если в войд закастить тоже выкидывают?
источник

O

Ofee in cxx.Дискуссионная
Егор
а если в войд закастить тоже выкидывают?
Хм... А я не попробовал...
источник

O

Ofee in cxx.Дискуссионная
Но если кратко — компилятор имеет доказательство бессмысленности кода и выпиливает строку :)
источник

Е

Егор in cxx.Дискуссионная
смотря что компилятор считает использованием
источник