Диджитал
я к тому, что такое изменение гораздо локальнее, чем лезть в vtbl
Constantine
пока функция не помечена constexpr она не может быть constexpr выражением
Диджитал
пусть компилятор убедится, что она constexpr, и вызовет
Constantine
виртуальная функция не может быть constexpr по действующему стандарту
Диджитал
и нет, я не подразумевал. что это можно сделать существующими средствами, возможно, просто их расширить
Диджитал
просто исходя из твоей проблемы, расширять нужно механизмы проверки, а не механизмы вызова
Constantine
модификация стандарта "компилятор должен проверить, что функция constexpr" глобальнее запрета использования this по декларации
Aidar
Я правда не совсем вижу профит
Constantine
Я хочу избежать синтаксиса "virtual static", поскольку взятие адреса такой функции не должно давать статическую функцию
Aidar
Какое-то ооп
Constantine
кстати, почему не должно?
потому что это НЕ статическая функция
Constantine
А Профит не трогать this какой?
Смотри. Ты реализуешь target_type для std::function
Aidar
const?
Constantine
У тебя под std::function лежит интерфейс
Aidar
Так а Профит то какой?
Constantine
Может ли значение target_type измениться вообще когда-нибудь при каких-нибудь обстоятельствах при вызове неконстантной функции этого интерфейса?
Constantine
Профит в том, что ты пишешь более сильный контракт метода
Aidar
Сделай константный
Constantine
Константными все методы интерфейса?
Aidar
Константными все методы интерфейса?
То что должно быть константным
Aidar
Ну в твоём случае не трогать this
Constantine
target_type это не просто константа, target_type это constexpr
Aidar
target_type это не просто константа, target_type это constexpr
У тебя виртуальность констекспр допустим ещё не завезли
Constantine
Ну ты просто выбрасываешь эту часть контракта
Aidar
Да и если завезли то в чем проблема?
Aidar
Читать нельзя?
Constantine
А потом тебе короче вписывают под твой контракт реализацию, в которой при перемещении на новый адрес target_type пропадает
Constantine
И это полностью удовлетворяет твой контракт, написанный на языке
Constantine
Ну, кроме комментария
Aidar
А у тебя ваще есть гарантия что например виртуальная таблица валидна там?
Constantine
Интересный вопрос, полагаю, что да, есть
Aidar
this невалиден а виртуальная таблица валидна?
Constantine
this не бывает невалиден
Constantine
For non-union class types (class and struct), the move constructor performs full member-wise move of the object's bases and non-static members, in their initialization order, using direct initialization with an xvalue argument
Constantine
Так что таблица виртуальных функций валидна
Constantine
Она безусловно инициализируется, а не копируется
Constantine
Кажется, это ровно вопрос типа "что будет при копировании со срезкой"
Aidar
this не бывает невалиден
Тогда я не понял зачем тебе не const virtual а новая штука
Constantine
Тогда я не понял зачем тебе не const virtual а новая штука
Потому что const это другая гарантия. Грубо говоря const гарантирует повторяемость вплоть до не-const вызова
Constantine
static является гарантией повторяемости независимо от вызовов методов
Aidar
Ну ты хочешь короче новую семантику с тем же поведением
Aidar
Странно все это
Aidar
Слишком математично
Constantine
Я хочу, чтобы можно было перенести требование статического полиморфизма "задана статическая/constexpr функция" в динамический полиморфизм
Constantine
Например, представь, у меня есть интерфейс IntegerType
Aidar
Тогда вызывать нечего
Berkus
язык
Constantine
struct IntegerInterface abstract { virtual std::string to_chars() const = 0; virtual intmax_t limit_max() const = 0; //декларация равносильна to_chars ?????? virtual void assign_integral(intmax_t) = 0; }; template <typename T> struct IntegralInteger : IntegerInterface { T inner; virtual std::string to_chars() const { return std::to_chars(inner); }; };
Constantine
вот как я должен в данном случае описать std::numeric_limit?
Constantine
ты не думал вместо плюсов на идрис писать?
я не верю в функциональное программирование общего назначения
Berkus
ах соо
Constantine
это-таки статическая штука
можно пример в коде?
Александр
можно пример в коде?
в общем, отмена. я ничего не понял
Constantine
на самом деле я должен грубо говоря объявить интерфейс, потом объявить шаблонную реализацию с параметром Traits, которая закроет через final методы с реализацией из Traits
Constantine
и не дай ?-? у меня что-то там будет наследоваться
Constantine
собственно внутренний интерфейс std::function virtual _Myt *_Copy(void *) const = 0; virtual const _XSTD2 type_info& _Target_type() const _NOEXCEPT = 0;
Aidar
Вобщем ты хочешь стратегии в компильтайм без наследования?
Constantine
Я хочу атрибуты фактических классов в рантайм без мапы с RTTI
Aidar
Тоесть чтоб в контейнер упихать
Constantine
В компильтайм все хорошо
Constantine
Шаблончик специализирую и все
Constantine
Ладно, вроде замечаний по существу не было, напишу потом. Есть более безумная вещь. 2. В конце выполнения auto return type deduction вместо ошибки в случае различия аргументов инстанцировать std::lang::common_type, специализация которого разрешена (с дополнительными условиями во избежание циклической зависимости)
usernameak
слушайте, а можно линковаться с вайновскими либами?
usernameak
чтобы вызывать вайновские методы в голом лянехсе
Berkus
можно, только без запущенного рантайма толку от этого никакого
usernameak
не, мне вызывать методы
Anonymous
ну ведь развалится без рантайма
usernameak
ну ведь развалится без рантайма
а можно запустить рантайм на время вызова методов?
Anonymous
какое-то извращение, давай рассказывай, зачем тебе оно надо
usernameak
d3dcompiler_43.dll