C++ lectures at MIPT (in Russian). Lecture 15. SFINAE

Поділитися
Вставка
  • Опубліковано 18 гру 2024

КОМЕНТАРІ • 11

  • @DENRENMaster
    @DENRENMaster 3 роки тому

    Взрыв, который никогда не кончится:
    template
    class A : public A
    {};
    int main () {
    A a;
    }

  • @oficsu
    @oficsu 4 роки тому +1

    9:33, "А можно ли устроить такой взрыв, который никогда не кончится?"
    Полагаю, что могу без привлечения математики ответить на этот вопрос. Да, с помощью decltype([]{}) в C++20 мы можем добиться теоритически бесконечной цепочки инстанцирований. Для этого достаточно decltype от лямбды сделать дефолтным шаблонным параметром. Тогда, при каждом инстанцировании, мы будем брать тип от разных уникальных лямбд.
    Это возможно и в более ранних версиях языка с (большими) оговорками, но было серой зоной стандарта и не все компиляторы справлялись, а те, которые справлялись - делали это очень по-разному

  • @artemfokin1119
    @artemfokin1119 3 роки тому +1

    47:03
    А есть ответ к этому? :) У меня, если не sfinae, с++17 говорит, что ambiguous overload. Или что-то другое имелось в виду?

    • @tilir
      @tilir  3 роки тому +1

      Стандарт в отношении перегрузки шаблонов функций это бездны. Ответ есть, но я его подробно разберу в том курсе (тоже на этом канале) где говорю про стандарт и тонкие вопросы. С другой стороны именно тут этот ответ в документе ищется не так уж сложно. И к счастью да, в основном там будет ambiguous overload

  • @oficsu
    @oficsu 4 роки тому +2

    Кроме того, добавлю, что is_detected не добавили в стандартную библиотеку не только в C++17, но даже и в C++20, оно носит статус TS и теперь очень вряд ли появится в стандартной библиотеке, ведь теперь у нас есть концепты и requires, позволяющий сделать то же самое прямо по месту объявления функции одной строкой
    И трейтов по типу is_same_t в стандартной библиотеке также нет, только is_same_v. Так что сейчас, трейты бывают либо только * _v, либо только *_t, исключений не помню

    • @tilir
      @tilir  4 роки тому +2

      Интересное дополнение, спасибо. Собственно с введением концепта is_same даже версия с _v уже не слишком нужна. Но это в стандартной библиотеке. Никто же не мешает наделать себе такого в своей программе. И делают

  • @artemfokin1119
    @artemfokin1119 3 роки тому +1

    57:03 float& вроде ловится же, просто float иницмализируется float&, проверил в c++17, может что-то другое имелось в виду?

    • @tilir
      @tilir  3 роки тому +2

      Да в том-то и дело. Мы хотим только функции возвращающие float, а у нас нечто возвращающее float& внезапно тоже пройдёт проверку

    • @artemfokin1119
      @artemfokin1119 3 роки тому +1

      @@tilir спасибо за ответы :)

  • @ivansvr8745
    @ivansvr8745 4 роки тому

    В этом докладе не рекомендуют использовать void_t
    ua-cam.com/video/udTEfwCkmaw/v-deo.html

    • @tilir
      @tilir  4 роки тому +3

      Мне кажется у автора там довольно самобытная позиция по многим вопросам.
      Момент насчёт void_t с привязкой по времени: ua-cam.com/video/udTEfwCkmaw/v-deo.html
      Что происходит с моей точки зрения: человек использует механизм неправильно и жалуется, что он не работает.
      Портить параметры функций SFINAE обёртками это как раз так себе идея и в лекции по метапрограммированию я объясняю какие есть альтернативы.
      Для своего же круга применений, void_t исключительно хорош и очень часто куда лучше чем enable_if.