
Berkus
29.09.2017
10:34:11

Ioann V
29.09.2017
10:42:45

Tom
29.09.2017
10:43:17

Ilia
29.09.2017
10:46:46

Google

Aidar
29.09.2017
10:48:17
Так стоп там вижак
На Линукс протести крч с -mnative
March*

Антон
29.09.2017
11:22:26

FailsBot
29.09.2017
11:35:41

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

Aidar
29.09.2017
13:21:24

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

Александр
29.09.2017
14:40:47

Constantine
29.09.2017
14:41:07
В частности, модификатор 'static' не создает полноценно статическую функцию, он лишь гарантирует, что возвращаемое значение зависит только от динамического типа объекта
В случае с constexpr компилятор имеет возможность вписать в таблицу виртуальных функций непосредственно результат вычисления constexpr выражения

Александр
29.09.2017
14:43:59

Ilia
29.09.2017
14:44:44

Антон
29.09.2017
14:45:15
а есть
а есть какой то враппер d3d9->opengl на линукс?
мне чтобы не вайн

Google

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

Александр
29.09.2017
14:45:18
Да и сейчас это всё реализуемо

Constantine
29.09.2017
14:45:34
И да, это не реализуемо без проверок

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

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

Ilia
29.09.2017
14:46:22

Constantine
29.09.2017
14:47:00

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

Constantine
29.09.2017
14:47:26

Constantine
29.09.2017
14:50:41

Antony
29.09.2017
14:52:08

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(/*форвард аргументов*/); }
};

Александр
29.09.2017
14:53:15

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:55:59

Дед Пегас
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
что нужно только в условиях жестких требований к производительности

Berkus
29.09.2017
15:05:06

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

Ilia
29.09.2017
15:06:26

Constantine
29.09.2017
15:07:43

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
Я все еще уверен, что в любой реализации есть такие функции
И есть контракты на уровне оговорок, которые я предлагаю в язык

Ilia
29.09.2017
15:09:36

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 в конкретную функцию