
Constantine
02.06.2017
17:21:00
я правильно понимаю, что constexpr выражения по сути вычисляются после генерации всех типов и шаблонных подстановок, поэтому в принципе не может быть способа перевода constexpr выражения в шаблонный параметр?

Александр
02.06.2017
17:22:54
почему?
constexpr size_t size = std::is_same<int, long>::value * 5 + 3;
std::array<int, size> a;

Constantine
02.06.2017
17:23:41
хм...

Александр
02.06.2017
17:23:41
вот аргумент constexpr функции не вытащить, ибо он может быть не constexpr

Google

Constantine
02.06.2017
17:24:54
зачем так делать?
почему нет strict constexpr сигнатуры функции

Александр
02.06.2017
17:26:21
вообще был пропозал сделать оператор constexpr(), который возвращал бы true, если текущий блок во время компиляции вычисляется

Constantine
02.06.2017
17:27:21
я бы сделал proposal что можно параметр constexpr функции помечать constexpr

Александр
02.06.2017
17:27:25
if constexpr (constexpr()) {
// а вот тут аргументы constexpr функции уже constexpr
}
хорошая мысль кстати
ибо иногда часть аргументов может быть известна в compile-time

Constantine
02.06.2017
17:27:52
и разрешить перегрузку
о, спасибо, действительно так не надо делать
я вспомнил аргументы против :)
Хотя явная пометка constexpr не создает никаких проблем, кажется. Там проблема была, что если хочется часть аргументов получать constexpr и учитывать это при оптимизации, оптимизатор должен сгенерировать несколько версий функции, как будто она шаблонная
В случае указания параметров функции как constexpr компилятор может интерпретировать это как функцию, у которой параметры, помеченные constexpr, шаблонные

Google

Александр
02.06.2017
17:35:22
и соответствующие ограничения накладывать?

Constantine
02.06.2017
17:37:18
интерпретировать в точности как сахар для шаблонного параметра с подстановкой фактических значений

Александр
02.06.2017
17:40:00
и что плохого?

Constantine
02.06.2017
17:42:25
а, это не работает, потому что шаблонный параметр не может быть значением user-defined type
*wall*

Antony
02.06.2017
17:45:23
я бы сделал proposal что можно параметр constexpr функции помечать constexpr
Есть множество предложений на эту и похожие темы. В международном комитете их постоянно обсуждают, к единому мнению пока не пришли: нужно сделать приятный/читаемый синтаксис, не все компиляторы до сих пор умеют хорошо constexpr, есть непонятки как смешивать constexpr и не constexpr аргументы + надо сделать так, чтобы пользователь не писал две функции (одну с constexpr параметром, другую - без)

Constantine
02.06.2017
17:47:20
т.е. разрешить фактически перегрузку функции по некоторым конкретным значениям переданных constexpr параметров


Antony
02.06.2017
17:50:35
Есть что-то наподобие if (constexpr()) и при этом constexpr() - хитрая штука, которая возвращает не compile time констунту. Там много проблем возникает с ODR если делать иначе.
В общем - пока рано обсуждать, разработчики компиляторов ещё не до конца определились как это должно выглядеть и как ничего не поломать таким кодом

▄︻̷ ┻ ═━一™
02.06.2017
17:55:54
..

Constantine
02.06.2017
18:05:25
Собственно, я могу описать задачу, с которой у меня это возникало
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
02.06.2017
18:17:06

Constantine
02.06.2017
18:19:20
Fmt?
с тех пор прошло много времени, и у меня есть некоторая тонна инфы, в частности, что такой синтаксис по сути невозможен

Berkus
02.06.2017
18:35:10
Ок
Используй cout-style для тайпчекинга

Alexander
02.06.2017
23:06:11
Новая работа во славу опен сорса подьехала : кто хочет пописать лабу для опенсорса с алгоритмами image processing, на основе opencv? Либа будет содержать в себе более эффективные алгоритмы бинаризации, алгоритмы автокропа, устранения размытия и так далее. Кто заинтересован - стучите мне.
Это не в буст, это просто либа, которую поле будем встраивать в различные OCR программы (gImageReader, например).

V
03.06.2017
06:53:53
Как таймер написать?

Antony
03.06.2017
07:01:00
Хороший асинхронный (и снхронный) таймер - Boost.Asio

Alexander
03.06.2017
07:28:46
Завтра начнётся ревью тимсорта в буст

Google

Berkus
03.06.2017
07:39:17
https://github.com/berkus/libuia/blob/master/include/uia/timer.h и timer_engine.h

Evgeniy
03.06.2017
08:21:21
Pointer Overflow Checking is in LLVM https://blog.regehr.org/archives/1518

Aidar
03.06.2017
09:06:59
Литеральные типы*
Но мне сказали что это уже D какой-то получается

Constantine
03.06.2017
12:23:19

Alexander
03.06.2017
12:24:32
Так точно!)

Constantine
03.06.2017
12:26:18
Вообще у меня тоже есть потребность во славу опенсорса :) Хочу инвертер jpeg-искажений скриншотов
Я сам там ниасилил, какую метрику надо впихать для поиска деквантованных коэффициентов DCT

Pepe
03.06.2017
13:23:17
Кто нибудь знает как в MPIR передать значение числу в виде 10^1000? Если вообще такое возможно

Evgeniy
03.06.2017
13:26:47

Pepe
03.06.2017
13:30:05
Щас посмотрю в интернете

Admin
ERROR: S client not available

Pepe
03.06.2017
13:31:29
То есть надо инициализировать ещё две переменные и посчитать результат

Evgeniy
03.06.2017
13:33:06

Pepe
03.06.2017
13:34:42
ну степень это просто число
Наверно так сделаю. Просто там есть способ строкой char ввести число я думал что может можно его просто ввести руками

Google

Evgeniy
03.06.2017
13:47:13
1e1000

Pepe
03.06.2017
13:48:13
1e1000
Вот так и хочу. Я вообще там не заметил что нужно объявить перед инициализацией. Перед assignment.

Владислав
03.06.2017
13:56:21
всем привет в этом чате

Evgeniy
03.06.2017
14:05:33

Pepe
03.06.2017
14:09:07
ну scanf такой формат поддерживает вроде
Насколько я понял там все сложно. Аргумент для присваивания должен быть типа mpz_t или double или char. То есть просто записать не получится, double слишком маленький, а mpz_t я никак не могу присвоить значение если нет другой mpz_t

Constantine
03.06.2017
14:30:04
1е1000 это не точное число

Evgeniy
03.06.2017
14:42:36

Constantine
03.06.2017
14:42:52
почему это?
потому что как дабл не может быть представлен точно

Friedrich
03.06.2017
14:43:08
Этот дабл вполне точно представляется как Infinity :)

Evgeniy
03.06.2017
14:43:12

Constantine
03.06.2017
14:43:35

Friedrich
03.06.2017
14:43:51
Ну, я говорил про 64-битный.

Constantine
03.06.2017
14:44:06
в 64-битный не полезет, да

Friedrich
03.06.2017
14:44:26
80-битный на всех платформах, которые я знаю, будет называться long double, если вообще там будет :)

Constantine
03.06.2017
14:45:21
при этом на практике компилятор может выполнять оптимизацию и все вычислить в 80битке, ничего не гарантируется
даже если операция с double

Friedrich
03.06.2017
14:46:15
Мне тоже почему-то припоминается, что у MS вообще нет 80-битного типа. Ну а в gcc / clang он есть (по крайней мере на Интеловской архитектуре).

Stanislav
03.06.2017
14:50:45

Google

Stanislav
03.06.2017
14:51:00
типа причина

Constantine
03.06.2017
14:52:19
угу, найсыч причина. Помню, что у моего начальника был ноут без поддержки SSE2 году в 2010, примерно

Stanislav
03.06.2017
14:55:19