function<int(int)>)
....
}
насколько вероятно что в компайл тайм f эвалуируется?
в function<int(int)?
если Foo не constexpr то даже пытаться не будет хД
статик ассерт здесь чтобы Foo принимала только определенные сигнатуры
В данном коде - никогда
у меня почему то 14й стандарт но без констэкспр в студии
на такой случай enable if или концепты
это лучше в enable_if, но не прям важно
не уверен но на 14 стандарте наверное нельзя в constexpr ничего сложнее return a?b:c
а чем enable_if лучше?
ну если у тебя функция принимает всего один тип функций int int, то смысла в шаблоне вообще мало, а enable if чтобы можно было сделатьперегрузку
я хотел вообще изначально просто с function сделать, но потом захотел чтобы функтор передавался в компайл тайме как-то
Если потом этот Foo пытаться проверять "можно ли в него такую штуку передать", то он enable_if/requires увидит и скажет "нельзя", а вот static_assert внутри не увидит
Концепты лучше, enable_if нет
в 99% случаев такие ассерты бесполезны т.к. если их не поставить выпадет ошибка компиляции просто другая(и скорее всего даже понятная)
выпадет непонятная
По static_assert failed можно грепать, его условие хорошо видно. enable_if выдает кучу срани вида no member type in blah или no viable overload
тем не менее через static assert не сделаешь перегрузки
Они нужны не всегда
для enable_if впилили костыли по моему в компиляторы, и там сообщение +- нормальное
согласен, но с enable_if анализатор ide сразу видит проблему и подчеркивает, что такой перегрузки не нашел. А с static_assert такая функция найдется всегда
Там все еще список кандидатов вываливается
Обсуждают сегодня