Constantine
Потому что язык чата - русский. В любом случае, я плохо представляю, насколько коряво выглядят фразы достаточно хорошо владеющих английским для британцев, учитывая, например, Английский язык является языком с ритмичным ударением, то есть ударные слоги отделены друг от друга в речи равными промежутками времени, а безударные слоги сокращаются так, чтобы соблюдался этот ритм
Evgenii
наверно потому что например это твое предложение по грамотности так себе
Миша
Привет. Как правильно читается такая запись? Application* _applicaton
Миша
Или киньте ссылкой, где почитать
Миша
Не знаю даже как правильно загуглить
Boris
указатель на объект класса Application
Миша
Спасибо, а тильда что значит? virtual ~Command();
Egor
Спасибо, а тильда что значит? virtual ~Command();
Command — конструктор класса Command, ~Command — деструктор. Но вообще лучше в @supapro вопросы по синтаксису
Berkus
Спасибо, а тильда что значит? virtual ~Command();
деструктор, но у тебя синтаксис неправильный
kitsu
Чего-то не могу отсыкать в гугле ответ: вызов realloc с меньшим размером гарантированно выполнится за константу?
kitsu
т.е доки не ограничивают и все аллокации памяти impl-defined?
Anton
Ребят, вопрос по structure bindings. Какими условиями должен соотвествовать класс, чтобы этим можно было пользоваться?
Vladislav
http://en.cppreference.com/w/cpp/language/structured_binding#Case_3:_binding_to_public_data_members
Anton
tuple и tie хранят данные публично?
Anton
Это просто реально странно, что вроде фитча полезная, но ограничения конские.
Vladislav
tuple и tie хранят данные публично?
нет, для туплов отдельный case (tie тоже возвращает tuple)
Vladislav
http://en.cppreference.com/w/cpp/language/structured_binding#Case_2:_binding_a_tuple-like_type
Vladislav
Вот только так(
ну вообще вполне логично что для structure bindings должен быть способ публично читать эти данные из объекта
Anton
ну вообще вполне логично что для structure bindings должен быть способ публично читать эти данные из объекта
Минус этого дела один (вернее два): надо специализировать std::tuple_size, std::tuple_elements. И тут херня в том, что нельзя просто так взять и распаковать частично вектор или вообще список. То есть это compile-time only штука, привязанная к std, конкретным именам и генерируемым компилятором дополнительным кодом, как и в случае с initializer_list. Это усё-таки выбешивает.
Vladislav
а как ты собрался распаковывать что-то с неконстантным числом элементов?
Anton
а как ты собрался распаковывать что-то с неконстантным числом элементов?
class CustmContainer { // ... template<size_t INDEX> auto& get() { return operator[](INDEX); } } Я очень надеялся, что этого будет достаточно. Это печально.
Vladislav
а caller как будет выглядеть?
Vladislav
нет, я про то как ты будешь собственно биндить
Anton
Ну, например. auto &[one, two, three] = container; В компайл тайм известно, по какому индексу надо вытащить элементы. По идее информации достаточно же.
Vladislav
а кто проверит что их ровно 3?
Vladislav
без этой проверки этот код опасен
Anton
Ну, тут да.
Anton
> (это) штука, привязанная к std, конкретным именам и генерируемым компилятором дополнительным (upd. высокуровневым) кодом, как и в случае с initializer_list. Но это lock на уровне языка. Оно не будет не воспроизводимо. Остаётся только case с распаковкой публичных полей.
Vladislav
прежде чем ты допишешь вопрос, советую прочитать правила чата
Timur
Телепатия!
Max
а что пишет? для начала можно начать с auto helper() -> std::remove_reference<decltype(*this)>::type; using ThisType = decltype(helper()); static_assert(std::is_same<ThisType, ТВОЙ_ТИП>::value, "!");
Я вот допереть не могу, почему нельзя так: #define SINGLETON_ACCESSIBLE \ using ThisType = std::remove_reference<decltype(*this)>::type; \ friend class Singleton<ThisType>; Ну то есть работает только так: #define SINGLETON_ACCESSIBLE \ static auto helper() -> std::remove_reference<decltype(*this)>::type; \ using ThisType = decltype(helper()); \ friend class Singleton<ThisType>;
Max
то есть внутри лямбды можно?
Max
а почему тогда лямбда должна быть именно static
Anatoly
то есть внутри лямбды можно?
если в захвате this присутствует
Max
если в захвате this присутствует
Ну тут он не захвачивается вроде
Max
Я как раз не хочу принимать класc. Если уже принимать, то можно тогда просто убрать using ThisType = Clazz
Berkus
столько адовых извращений ради одной строчки friend class Derived; подумай о бедных людях которым потом это говнище сопровождать!
Max
Почему говнище?
Berkus
когда ты через год попробуешь в этом коде разобраться - я послушаю твои ругательства
Max
а в тут разбираться-то? https://ideone.com/qsYqMj
Max
Разве что макрос, который выводит тип класса, в котором ты его прописывешь. Как по мне, так получилось неплохо. Наследник легко делается, просто юзается.
Berkus
а в тут разбираться-то? https://ideone.com/qsYqMj
хорошо что никогда не бывает двух Singleton базовых классов, да
Max
сарказм?
Berkus
нет, без таблички
Berkus
https://ideone.com/jkT6ww просто у меня есть версия еще короче и без макросов!
Max
https://ideone.com/jkT6ww просто у меня есть версия еще короче и без макросов!
Дело вкуса. SINGLETON_ACCESSIBLE обьясняет, зачем указан, а friend class желательно сопроводить коментом, а то человек откроет такой, вроде уже и так унаследовались от синглтона, а тут еще зачем-то friend class
Berkus
про singleton accessible тоже неплохо бы написать документацию длиннее чем // magic
Max
про singleton accessible тоже неплохо бы написать документацию длиннее чем // magic
в оригинальном файле так и сделал + написал примеры, не волнуйся :)
Berkus
мкей, я то чо, каждый сам пиздец своего счастья!
Max
проехали, а то спамим
Constantine
Можно ли как-то сделать (с модификацией языка), чтобы std::shared_ptr<Derived> был совместимым типом с std::shared_ptr<Base> ?
Anatoly
дык std::shared_ptr<Derived> приводится к std::shared_ptr<Base> без проблем
Constantine
дык std::shared_ptr<Derived> приводится к std::shared_ptr<Base> без проблем
речь о понятии covariant type для виртуальных функций (почему я думал, что там используется слово compatible?)
Egor
А можно код?
Max
речь о понятии covariant type для виртуальных функций (почему я думал, что там используется слово compatible?)
то есть возвращать std::shared_ptr<Derived> из функции , которая возвращает std::shared_ptr<Base>, я правильно понял ?
Александр
Constantine
А можно код?
держи struct Base { virtual ~Base() {}; virtual std::shared_ptr<Base> clone() = 0; //сейчас работает с Base* }; struct Derived : Base { std::shared_ptr<Derived> clone() override = 0; //сейчас работает с Derived* };
Александр
а что?
метод, у которого возвращаемый тип задаётся через -> type
Constantine
Окей, и что хотим сделать?
Чтобы этот пример скомпилировался и работал как надо
Max
Чтобы этот пример скомпилировался и работал как надо
Почему не использовать std::static_pointer_cast?
Egor
Чтобы этот пример скомпилировался и работал как надо
У тебя тут контрвариантность нужна.
Egor
Потому что возвращаемое значение функции
Egor
Хотя...
Constantine
У тебя тут контрвариантность нужна.
я уже исправился, cppreference действительно называет это covariant, а не совместимость
Egor
Не, там ещё есть contravariant, кажется =)
Max
Как?
Ну я имею ввиду сделать и там, и там shared_ptr<Base>