@ProCxx

Страница 1337 из 2477
Google
Aidar
29.09.2017
10:48:17
Так стоп там вижак

На Линукс протести крч с -mnative

March*

Антон
29.09.2017
11:22:26
March*
Марш натив

FailsBot
29.09.2017
11:35:41
/shrug
¯\_(ツ)_/¯

Berkus
29.09.2017
11:36:26
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0458r0.html госсподи, наконец-то, спустя 20 с лишним лет....

Ilia
29.09.2017
11:38:20
Да...

Aidar
29.09.2017
11:59:23
И ваще такой треит нужен тогда в итераторы

Александр
29.09.2017
13:00:34
Плюсую за каст к булу
Это ж весь ABI поломает, так как придется хранить в итераторе флаг. Хотя я тоже за

Это ж весь ABI поломает, так как придется хранить в итераторе флаг. Хотя я тоже за
Да и неясно, чему этот флаг должен равняться для обычных ситуаций. Когда мы просто по коллекции идём, понятия is_found не существует

Google
Aidar
29.09.2017
13:21:48
Нужно просто будет находить контейнер, не уверен что они сейчас так не умеют

Или проверку на условие энда

Оно там и так есть возможно

Александр
29.09.2017
13:23:04
Это оверхед лишний. Тому же итератору для вектора ничего не надо знать, только указатель на элемент

Aidar
29.09.2017
13:23:05
Не все итераторы должны быть такими

Александр
29.09.2017
13:23:14
Так что он никак не узнает end он или нет

А, ну да.

Aidar
29.09.2017
13:23:23
Треитсы

Это фича а не ограничение

Constantine
29.09.2017
14:39:21
Во! Придумал синтаксис. Хочу для виртуальных функций два дополнительных модификатора ref-значения static и constexpr. struct base { virtual int get_attribute() constexpr = 0; }; struct derived : base { virtual int get_attribute() constexpr override { return 1; } };

Модификатор 'static' означает, что в теле функции не определен this; модификатор 'constexpr' дополнительно означает, что сама функция должна быть constexpr

Constantine
29.09.2017
14:41:07
А причем тут виртуальность?)
При том, что это - виртуальная функция со всеми вытекающими последствиями

В частности, модификатор 'static' не создает полноценно статическую функцию, он лишь гарантирует, что возвращаемое значение зависит только от динамического типа объекта

В случае с constexpr компилятор имеет возможность вписать в таблицу виртуальных функций непосредственно результат вычисления constexpr выражения

Ilia
29.09.2017
14:44:44
Антон
29.09.2017
14:45:15
а есть

а есть какой то враппер d3d9->opengl на линукс?

мне чтобы не вайн

Google
Антон
29.09.2017
14:45:15
только dx

Antony
29.09.2017
14:46:06
Не хочется портить вам счастье, но если объект содержит виртуальные функции, его нельзя сделать constexpr

Александр
29.09.2017
14:46:17
Чем ломается?
Например, хранением в таблице виртуальных функций не функции, а значения

Ilia
29.09.2017
14:46:22
Это не обязательно const
Ты же хочешь значение, зависящее от динамического типа объекта ?

Constantine
29.09.2017
14:47:00
Не хочется портить вам счастье, но если объект содержит виртуальные функции, его нельзя сделать constexpr
Антон, подразумевается, что сама по себе функция является constexpr, грубо говоря как если бы она была в точности так же написана как статическая функция класса

Александр
29.09.2017
14:47:02
В текущем стандарте языка все эти хотелки и так работают, просто да, где-то лишний раз передаётся this, который фактически не требуется

Constantine
29.09.2017
14:47:26
Constantine
29.09.2017
14:50:41
Не хочется портить вам счастье, но если объект содержит виртуальные функции, его нельзя сделать constexpr
Т.е. подразумевается, что модификатор 'static' равносилен требованию "функция возвращает результат статической функции (тело функции) этого же класса с теми же параметрами", модификатор constexpr "функция возвращает результат статической constexpr функции (тело функции) этого же класса с теми же параметрами"

Constantine
29.09.2017
14:52:17
struct base { virtual int get_attribute() constexpr = 0; }; //предложение struct derived : base { virtual int get_attribute() constexpr override { return 1; } }; //развертка в действующий стандарт struct derived : base { static constexpr int get_attribute__inner() { return 1; }; virtual int get_attribute() override { return get_attribute__inner(/*форвард аргументов*/); } };

Constantine
29.09.2017
14:53:19
можно макросами обмазать

Antony
29.09.2017
14:54:11
предлагаю вместо virtual использовать override

Constantine
29.09.2017
14:55:32
т.е. начинать декларацию с override?

Antony
29.09.2017
14:55:38
Не, фигня получается struct base { override static constexpr int get_attribute(); };

Google
Дед Пегас
29.09.2017
14:56:01
override уже ведь занят.

Constantine
29.09.2017
14:56:11
в данном случае речь идет о наложении дополнительных требований на тело функции

весьма непонятен вопрос сигнатуры такой функции

Антон
29.09.2017
14:57:01
virtual в таком случае должен резолвиться на этапе компиляции

Constantine
29.09.2017
14:57:20
он не может быть зарезолван

Дед Пегас
29.09.2017
14:57:33
constvirual

Вводим новое

Admin
ERROR: S client not available

Constantine
29.09.2017
14:57:47
struct base { virtual int get_attribute() constexpr = 0; }; struct derived : base { virtual int get_attribute() constexpr override { return 1; } }; void foo(base const& b) { b.get_attribute(); //значение? //base::get_attibute(); //ошибка компиляции derived::get_attibute(); //все-таки должно быть нормально }

Диджитал
29.09.2017
15:00:16
реальное применение можешь озвучить?

Constantine
29.09.2017
15:00:42
сериализация объектов с фабрикой по имени

фабрика по имени создает объект конкретного типа и безумно хочет, чтобы любой созданный ей объект в ответ на запрос имени возвращал то же самое

сейчас фабрика в этом случае может использовать map и RTTI

что является ручной реализацией vtbl по сути

Berkus
29.09.2017
15:03:57
вряд ли из-за одного маргинального юзкейса это надо тащить прямо в язык

Constantine
29.09.2017
15:04:23
почему маргинального?

Berkus
29.09.2017
15:04:37
ну потому что это и так уже можно сделать с RTTI

Диджитал
29.09.2017
15:04:48
я вижу только один смысл тащить значение в vtbl - избежать лишнего вызова

Constantine
29.09.2017
15:04:55
реализация map+RTTI позволяет вообще не использовать виртуальные функции

Google
Диджитал
29.09.2017
15:05:05
что нужно только в условиях жестких требований к производительности

Constantine
29.09.2017
15:05:17
так и не надо
удалить виртуальные функции из языка как сахар?)

на самом деле, я уверен, юзкейз можно найти в любой библиотеке с динамическим полиморфизмом

Ilia
29.09.2017
15:06:26
фабрика по имени создает объект конкретного типа и безумно хочет, чтобы любой созданный ей объект в ответ на запрос имени возвращал то же самое
Тут другая проблема, ты приводишь пример применения в программе, написанной на языке, А не в самом языке. Т.е. это будет полезно только в частной программе. Целиком языку будет не полезно.

Ilia
29.09.2017
15:07:58
Ну как ещё сказать...

Nik
29.09.2017
15:08:04
Можно пойти дальше и потребовать возможность задавать кастомные атрибуты

Ilia
29.09.2017
15:08:23
Ты улучшаешь язык для какого-то частного применения

Constantine
29.09.2017
15:08:46
Я все еще уверен, что в любой реализации есть такие функции

И есть контракты на уровне оговорок, которые я предлагаю в язык

Constantine
29.09.2017
15:09:52
Просто STL совершенно не использует динамический полиморфизм

Ilia
29.09.2017
15:10:39
Прикинь, да... Открытие ?

Constantine
29.09.2017
15:10:52
Да, но это совершенно невозможно в разработке хоть немного сложной программы

При этом нет ни одного способа преобразовать контракты статического полиморфизма "задано constexpr поле" в динамический

Например, фактическая реализация std::function после потери типа не может потребовать проверить из внутреннего интерфейса по контракту "is_nothrow_move_constructible"

Кстати, надо запомнить, годные аргументы для преамбулы

Диджитал
29.09.2017
15:18:26
пока что звучит так, что тебе скорее нужны хитрые ассерты, а не правка vtbl

Constantine
29.09.2017
15:24:46
это невозможно проверить никаким ASSERT-ом, потому что это статическая проверка

на MSC это очень условно можно проверить ассертом, передав 0 в качестве this в конкретную функцию

Страница 1337 из 2477