Vladislav
Constantine
я правильно понимаю, что constexpr выражения по сути вычисляются после генерации всех типов и шаблонных подстановок, поэтому в принципе не может быть способа перевода constexpr выражения в шаблонный параметр?
Александр
почему?
constexpr size_t size = std::is_same<int, long>::value * 5 + 3;
std::array<int, size> a;
Constantine
хм...
Александр
вот аргумент constexpr функции не вытащить, ибо он может быть не constexpr
Constantine
зачем так делать?
Constantine
почему нет strict constexpr сигнатуры функции
Александр
Александр
вообще был пропозал сделать оператор constexpr(), который возвращал бы true, если текущий блок во время компиляции вычисляется
Constantine
я бы сделал proposal что можно параметр constexpr функции помечать constexpr
Александр
if constexpr (constexpr()) {
// а вот тут аргументы constexpr функции уже constexpr
}
Александр
хорошая мысль кстати
Александр
ибо иногда часть аргументов может быть известна в compile-time
Constantine
и разрешить перегрузку
Constantine
о, спасибо, действительно так не надо делать
Constantine
я вспомнил аргументы против :)
Constantine
Хотя явная пометка constexpr не создает никаких проблем, кажется. Там проблема была, что если хочется часть аргументов получать constexpr и учитывать это при оптимизации, оптимизатор должен сгенерировать несколько версий функции, как будто она шаблонная
Constantine
В случае указания параметров функции как constexpr компилятор может интерпретировать это как функцию, у которой параметры, помеченные constexpr, шаблонные
Александр
и соответствующие ограничения накладывать?
Constantine
интерпретировать в точности как сахар для шаблонного параметра с подстановкой фактических значений
Александр
и что плохого?
Constantine
а, это не работает, потому что шаблонный параметр не может быть значением user-defined type
Constantine
*wall*
🐙 Antony
я бы сделал proposal что можно параметр constexpr функции помечать constexpr
Есть множество предложений на эту и похожие темы. В международном комитете их постоянно обсуждают, к единому мнению пока не пришли: нужно сделать приятный/читаемый синтаксис, не все компиляторы до сих пор умеют хорошо constexpr, есть непонятки как смешивать constexpr и не constexpr аргументы + надо сделать так, чтобы пользователь не писал две функции (одну с constexpr параметром, другую - без)
Constantine
Constantine
т.е. разрешить фактически перегрузку функции по некоторым конкретным значениям переданных constexpr параметров
🐙 Antony
Есть что-то наподобие if (constexpr()) и при этом constexpr() - хитрая штука, которая возвращает не compile time констунту. Там много проблем возникает с ODR если делать иначе.
В общем - пока рано обсуждать, разработчики компиляторов ещё не до конца определились как это должно выглядеть и как ничего не поломать таким кодом
Anonymous
..
Constantine
Собственно, я могу описать задачу, с которой у меня это возникало
using some_interface_uptr = std::unique_ptr<some_interface>;
enum class align_h { none, left, center, right };
enum class align_v { none, top, middle, bottom };
//1
some_interface_uptr make_aligner_1(some_interface_uptr, align_h h, align_v v);
//2
template <align_h h, align_v v>
some_interface_uptr make_aligner_2(some_interface_uptr) {...} //redirect
template <>
some_interface_uptr make_aligner_2<align_h::none, align_v::none>(some_interface_uptr) {...} //you're doing it wrong, but I will let you
и аналогичные конструкции в итоге встречаются достаточно часто, собственно.
Вся функция в принципе не может быть constexpr. И хотя в этом случае компилятор еще кое-как можно сделать тупо произведение всех конфигураций, вроде оптимизация конструкций типа явное создание вектора с нулем элементов выглядит чрезвычайно целесообразной.
Berkus
Berkus
Constantine
Fmt?
с тех пор прошло много времени, и у меня есть некоторая тонна инфы, в частности, что такой синтаксис по сути невозможен
Berkus
Ок
Berkus
Используй cout-style для тайпчекинга
Anonymous
Как таймер написать?
🐙 Antony
Хороший асинхронный (и снхронный) таймер - Boost.Asio
Berkus
https://github.com/berkus/libuia/blob/master/include/uia/timer.h и timer_engine.h
Evgenii
Pointer Overflow Checking is in LLVM https://blog.regehr.org/archives/1518
Aidar
Aidar
Aidar
Литеральные типы*
Aidar
Но мне сказали что это уже D какой-то получается
Constantine
Во славу опенсорса - местный эвфемизм бесплатно? :)
Constantine
Вообще у меня тоже есть потребность во славу опенсорса :) Хочу инвертер jpeg-искажений скриншотов
Constantine
Я сам там ниасилил, какую метрику надо впихать для поиска деквантованных коэффициентов DCT
Pepe 🐸
Кто нибудь знает как в MPIR передать значение числу в виде 10^1000? Если вообще такое возможно
Evgenii
Pepe 🐸
Щас посмотрю в интернете
Pepe 🐸
Pepe 🐸
То есть надо инициализировать ещё две переменные и посчитать результат
Evgenii
Pepe 🐸
ну степень это просто число
Наверно так сделаю. Просто там есть способ строкой char ввести число я думал что может можно его просто ввести руками
Evgenii
Evgenii
1e1000
Pepe 🐸
1e1000
Вот так и хочу. Я вообще там не заметил что нужно объявить перед инициализацией. Перед assignment.
vladislav
всем привет в этом чате
Evgenii
Pepe 🐸
ну scanf такой формат поддерживает вроде
Насколько я понял там все сложно. Аргумент для присваивания должен быть типа mpz_t или double или char. То есть просто записать не получится, double слишком маленький, а mpz_t я никак не могу присвоить значение если нет другой mpz_t
Constantine
1е1000 это не точное число
Evgenii
Constantine
почему это?
потому что как дабл не может быть представлен точно
Dr. Friedrich
Этот дабл вполне точно представляется как Infinity :)
Evgenii
Constantine
Dr. Friedrich
Ну, я говорил про 64-битный.
Constantine
в 64-битный не полезет, да
Dr. Friedrich
80-битный на всех платформах, которые я знаю, будет называться long double, если вообще там будет :)
Constantine
Constantine
при этом на практике компилятор может выполнять оптимизацию и все вычислить в 80битке, ничего не гарантируется
Constantine
даже если операция с double
Dr. Friedrich
Мне тоже почему-то припоминается, что у MS вообще нет 80-битного типа. Ну а в gcc / clang он есть (по крайней мере на Интеловской архитектуре).
Stanislav
типа причина
Constantine
угу, найсыч причина. Помню, что у моего начальника был ноут без поддержки SSE2 году в 2010, примерно
Stanislav
Constantine
просто я до сих пор не уверен, что MS по дефолту вообще компилит с разрешенным SSE2
Stanislav
я ща скажу
Constantine
ну если 17й есть, интересно даже