Size: a a a

2020 August 07

AK

Alexander Krivitskiy in rust_offtopic
Nick Linker
Я кстати тоже хотел бы посмотреть, где без decltype невозможно обойтись. Выглядит фича (если это фича...) как загнутый костыль.
источник

DF

Dollar Føølish in rust_offtopic
Деклтайп много где нужен
источник

NL

Nick Linker in rust_offtopic
Почему в Хаскеле/Окамле/Скале он не нужен?
источник

DF

Dollar Føølish in rust_offtopic
Потому что там нет шаблонов и лямбд плюсовых
источник

DF

Dollar Føølish in rust_offtopic
И перфект форвардинга
источник

DF

Dollar Føølish in rust_offtopic
По сути ведь лямбда с auto&& это тоже шаблон
источник

DF

Dollar Føølish in rust_offtopic
А с 20 стандарта поддерживаются явные шаблоны лямбд
источник

DF

Dollar Føølish in rust_offtopic
Вывод типов в плюсах на самом деле достаточно богатый, включая например индуктивные типы. Просто неудобный
источник

p

polunin.ai in rust_offtopic
@Psilon покажи тайпклассы в шарпе, я не могу найти что ты показывал
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
@Psilon покажи тайпклассы в шарпе, я не могу найти что ты показывал
interface ISemigroup<T>
{
   T Combine(T left, T right);
}

struct IntSumSemigroup : ISemigroup<int>
{
  public int Combine(int left, int right) => left + right;
}

public T ThreeTimes<T, TSemigroup>(T one) where TSemigroup: struct, ISemigroup<T> {
  var witness = default(TSemigroup);
  return witness.Combine(witness.Combine(one, one), one);
}
источник

В

Вафель in rust_offtopic
Doge Shibu
interface ISemigroup<T>
{
   T Combine(T left, T right);
}

struct IntSumSemigroup : ISemigroup<int>
{
  public int Combine(int left, int right) => left + right;
}

public T ThreeTimes<T, TSemigroup>(T one) where TSemigroup: struct, ISemigroup<T> {
  var witness = default(TSemigroup);
  return witness.Combine(witness.Combine(one, one), one);
}
Это получаются как имплиситы в скале, только експлиситы? 🤔
источник

CD

Constantine Drozdov in rust_offtopic
Nick Linker
using namespace std;

template <typename T, typename T2>
decltype(auto) nth_element(T& container, T2 index) {
    return container[index];
}

int main() {
  vector<int> v(10,0);
  nth_element(v,1) = 10;
  auto x = nth_element(v,1);

  for (auto &i:v) cout << i << '\n';
  cout << "x == " << x << '\n';
}

Вот такой код я увидел как образец использования decltype(auto). Казалось бы прекрасный код, но если пользователь вызовет не
auto x = nth_element(v,1);

а
auto x = nth_element(vector<int>{1,2,3},1);

то привет 🤪
Самое интересное, что с нормальными тайпклассами всей этой акробатики нафиг не нужно.
ты что сказать-то хотел? вот это?
https://wandbox.org/permlink/sZLTBfeUjcabdUdC
источник

DS

Doge Shibu in rust_offtopic
Вафель
Это получаются как имплиситы в скале, только експлиситы? 🤔
Очень отдаленно. Проблема этого подхода, что ресолв инстансов тебе придется делать руками и передавать через дженерик параметры, что очень упорото.
источник

DS

Doge Shibu in rust_offtopic
Зато есть плюс в том, что такой энкодинг дико дружелюбен для шарпового jit'а
источник

V

Vetro in rust_offtopic
std::conditional_t<std::is_lvalue_reference_v<T>, decltype(container[index]), std::decay_t<decltype(container[index])>>

читабельно что пиздец
источник

V

Vetro in rust_offtopic
куда глаза выбрасывать?
источник

Ct

Casual tears in rust_offtopic
Предположу, хотел сказать, что в плюсы борроучекер не завезли.
источник

SP

Stanislav Popov in rust_offtopic
Vetro
std::conditional_t<std::is_lvalue_reference_v<T>, decltype(container[index]), std::decay_t<decltype(container[index])>>

читабельно что пиздец
источник

p

polunin.ai in rust_offtopic
Vetro
std::conditional_t<std::is_lvalue_reference_v<T>, decltype(container[index]), std::decay_t<decltype(container[index])>>

читабельно что пиздец
не скала и на том спасибо
источник

CD

Constantine Drozdov in rust_offtopic
Vetro
std::conditional_t<std::is_lvalue_reference_v<T>, decltype(container[index]), std::decay_t<decltype(container[index])>>

читабельно что пиздец
&'a намного читабельнее (нет)
источник