Igor
о https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/README.md баян?
Крылатый
Прелюбопытнейшая дискуссия, товарищи плюсачи. https://www.reddit.com/r/cpp/comments/6mpbtr/why_are_stdtuples_constructors_all_noexceptfalse/
Constantine
а можно class member function добавить модификатор "нельзя использовать this"? :)
Constantine
как const и && только this=delete
Constantine
именно
Matwey
static
Nik
а зачем?
Berkus
да, конечно, объяви ее static
Constantine
static
Вы можете самостоятельно понять, что это не то же самое. Это не вопрос в supapro :)
Constantine
Я не могу делать виртуальную static функцию
Berkus
но в целом это именно то что нужно, static + ручной dispatch
Constantine
Я могу сделать аналогичную вещь через RTTI и статическую функцию, да, но это наркомания
Berkus
можно еще внутри лямбду исползовать которая this не капчурит
Berkus
virtual void test() { []{ no this bitches }(); }
Constantine
это часть сигнатуры метода, как и const
Constantine
этот метод в потомках не имеет права использовать this явно
Berkus
*yawn* ну сделай ему сигнатуру сам
Berkus
сигнатура это ж просто буковки
Constantine
у меня сейчас это просто синтаксис генератора, не поддерживаемый плюсами
Constantine
так что я уже сделал сам, да
Constantine
по сути это виртуальный атрибут класса
Berkus
Constantine
такое чувство, что ты пишешь на сях, а не на плюсах)
Constantine
потому что на самом деле в плюсах есть только одна действительно стоящая вещь - компилятор можно заставлять делать проверки
Berkus
и эта вещь стоит всего остального, да
Constantine
по крайней мере эта вещь, из-за которой C++ не безнадежен
Berkus
ты мог бы писать на хаскеле и не иметь этих проблем, ныл бы в другой чатик
Konstantin
а можно class member function добавить модификатор "нельзя использовать this"? :)
А можешь в двух словах объяснить, нафига тебе это?
Constantine
А можешь в двух словах объяснить, нафига тебе это?
Мне нужно "виртуальную статическую функцию"
Constantine
ты мог бы писать на хаскеле и не иметь этих проблем, ныл бы в другой чатик
я не специалист по хаскелю (не знаю его совсем), но у меня на него срабатывает эвристика "если он так хорош, почему на нем не пишут все" :)
🐙 Antony
Мне нужно "виртуальную статическую функцию"
Чувствую, что пожалею об этом... А как вы собиаретесь это использовать в коде?
Виталий
Мне нужно "виртуальную статическую функцию"
Может, надо наследовать синглтон?
Constantine
Чувствую, что пожалею об этом... А как вы собиаретесь это использовать в коде?
Например, у меня есть иерархия возможных "примитивных" типов генератора (не может быть реализована статикой), и для каждого типа определены его параметры
Constantine
Чувствую, что пожалею об этом... А как вы собиаретесь это использовать в коде?
Грубо говоря, реализация на динамическом полиморфизме того, что на статическом полиморфизме будет class traits
🐙 Antony
а можете пример в виде кода написать? А то я всё еще не догоняю
Constantine
struct ReflectionType { virtual ~ReflectionType() {}; virtual bool isMoveConstructible() /*this(delete)*/ = 0; }; std::unique_ptr<ReflectionType> ReflectionTypeByName(std::string name) { //фабрика } template <typename Type> struct KnownCppType: ReflectionType { virtual bool isMoveConstructible() /*this(delete)*/ { return std::is_move_constructible<Type>::value; } };
Berkus
никак не объясняет зачем тут this=delete
Constantine
никак не объясняет зачем тут this=delete
затем, что на самом деле следующая реализация семантически ошибочна: struct HackedReflectionType: ReflectionType { bool isMoveConstructible_; virtual bool isMoveConstructible() { return isMoveConstructible_; } };
Konstantin
Constantine
Смотря на что
Можно вообще не писать никогда. Кажется, утверждалось, что const не учитывается компилятором, кроме как для проверки того, что кто-то не стреляет себе в ногу
Олександр
Всем привет, кто-нибудь сталкивался с раскраской отдельных элементов SVG-файла путём клика на области этих элементов? Типа, определять по координатам точки, какой это тэг файла. Если что, пишется это на виджетах Qt
🐙 Antony
struct ReflectionType { virtual ~ReflectionType() {}; virtual bool isMoveConstructible() /*this(delete)*/ = 0; }; std::unique_ptr<ReflectionType> ReflectionTypeByName(std::string name) { //фабрика } template <typename Type> struct KnownCppType: ReflectionType { virtual bool isMoveConstructible() /*this(delete)*/ { return std::is_move_constructible<Type>::value; } };
Можно вот так попробовать (тут страшненько написано, нужно причесать): ` struct ReflectionType { private: virtual ~ReflectionType() {}; friend class ReflectionTypeImpl; public: virtual bool isMoveConstructible() const noexcept = 0; }; template <class Impl> struct ReflectionTypeImpl : ReflectionType{ bool isMoveConstructible() const noexcept override { return Impl::get_something(); } }; std::unique_ptr<ReflectionType> ReflectionTypeByName(std::string name) { //фабрика } template <typename Type> struct KnownCppType: ReflectionTypeImpl<KnownCppType<Type> > { static bool get_something() noexcept { return std::is_move_constructible<Type>::value; } };
Олександр
хм, интересная идея, спасибо!
Constantine
Можно вот так попробовать (тут страшненько написано, нужно причесать): ` struct ReflectionType { private: virtual ~ReflectionType() {}; friend class ReflectionTypeImpl; public: virtual bool isMoveConstructible() const noexcept = 0; }; template <class Impl> struct ReflectionTypeImpl : ReflectionType{ bool isMoveConstructible() const noexcept override { return Impl::get_something(); } }; std::unique_ptr<ReflectionType> ReflectionTypeByName(std::string name) { //фабрика } template <typename Type> struct KnownCppType: ReflectionTypeImpl<KnownCppType<Type> > { static bool get_something() noexcept { return std::is_move_constructible<Type>::value; } };
С практической точки зрения у меня есть генератор, который просто сгенерирует в этом месте вызов статической функции и форвард аргументов. С теоретической точки зрения мне не очень нравится данное решение, поскольку совершенно не очевидно, как там поддерживать наследование (очень хочется делать, чтобы фактический ReflectionType для Derived наследовал фактический ReflectionType для Base).
Крылатый
https://vittorioromeo.info/index/blog/zeroalloc_continuations_p1.html
Anatoly
@antoshkka а это валидное объявление другом friend class ReflectionTypeImpl; при условии, что ReflectionTypeImpl template?
Anatoly
вроде, должно быть template<typename T> friend class ReflectionTypeImpl;
Stanislav
@zamazan4ik а ты смотрю активно пишешьв пропозалах)
Stanislav
🙈 да за сегодня уже 3-4 письмо от тебя вижу
vladislav
самый активный участник чата за полгода
Stanislav
а я тупой :) хз че там писать
Stanislav
я вроде один раз написал, меня не поняли слегка я подзабил
Stanislav
да я читаю зато) там про extended классы было
Stanislav
как это, в шарпах есть такое
vladislav
а кто стандарт читал? Чтобы от корки до корки.
Крылатый
А кто не читал?
vladislav
кстати
vladislav
я не читал
Stanislav
дааа
Stanislav
во в шарпах так и называются C# extension methods
Stanislav
дак не ясно как ее готовить слегка
Stanislav
учитывая юниты трансляции всякие
Constantine
А что там технически такое расширение?
Stanislav
а если в .спп файле это делаешь? какие нахер модули?
Stanislav
А что там технически такое расширение?
есть класс, мб базовый типа std::string ты добавляешь в него свой метод
Stanislav
удобна
Крылатый
Миксины шоле?
Constantine
ну это может быть реализовано одним костылем, правда, по-хорошему нужно иметь модуль, который их все знает
Stanislav
Constantine
короче вбрасываю идею
Constantine
C++ позволяют объявить шаблонный метод и не реализовать его
Constantine
реализация метода - запрос какой-то части класса по некоторому типу