Russian Qt Forum
Май 21, 2024, 21:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 11 12 [13] 14 15 16   Вниз
  Печать  
Автор Тема: Приватные методы  (Прочитано 98153 раз)
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #180 : Октябрь 03, 2015, 00:20 »

и не нужно изобретать на каждый чих отдельные структуры,
наследовать их от каких то интерфейсов, и тп.
Хорошо, принимающий получил это чудо, что он будет с ним делать не зная типы?
подписчик на сообщение как бы знал на что подписывался.

Код:
struct Reader
{
    void ReadMessage( const boost::tuple<int, const char*, const char*>&   );
};

...

Reader r;

// --- шаблономагия проанализует тип параметра метода
// и поймет какие тупли может принимать данный подписчик
Subscribe(r, &Reader::ReadMessage);

// --- сгенерирует тупель boost::tuple<int, const char*, const char*>
// и доставит всем, кто подписался на него
SendMessage(10)("hello")("world")();
...

Во что это отливается в asm? Это аргументы подаваемые на стек или как? Могу ли это я как-то в языке юзать  "просто так", без туплей? Спасибо

c точки зрения эффективности, это тоже самое, что и вариадик-шаблоны.

в c++03 я делал так:
Код:
SendMessage(10)(true)();
...
void Reader::ReadMessage(  const boost::tuple<int,bool>& ) { ... }
в с++11 я делаю так:
Код:
SendMessage(10, true);
...

void Reader::ReadMessage(  const int&, const bool& ) { ... }

там нет никаких аллокаций, левых копирований,
и все прекрасно inline

« Последнее редактирование: Октябрь 03, 2015, 00:23 от _Bers » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #181 : Октябрь 03, 2015, 08:11 »

подписчик на сообщение как бы знал на что подписывался.
Да, конечно

// --- шаблономагия проанализует тип параметра метода
// и поймет какие тупли может принимать данный подписчик
Subscribe(r, &Reader::ReadMessage);
Тут неясно, если можно, подробнее. Как управление попадет на точку "того самого" ReadMessage?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #182 : Октябрь 03, 2015, 18:41 »

Цитировать
в c++03 я делал так:
Ну дык в новом стандарте так можно и без всяких туплей сделать..)
Наверное, boost::fusion служит примером того, где они (тупли) используются) Ну и boost::spirit, например)  Если речь зашла о метошаблонной магии)
« Последнее редактирование: Октябрь 03, 2015, 18:42 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #183 : Октябрь 03, 2015, 21:37 »

Что вы имеете в виду под Меташаблонами? Если это те, что появились в результате случайной ошибки, то оправдание их использования очень спорно.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #184 : Октябрь 04, 2015, 02:26 »

Что вы имеете в виду под Меташаблонами? Если это те, что появились в результате случайной ошибки, то оправдание их использования очень спорно.

detected: ниосилятор
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #185 : Октябрь 04, 2015, 02:52 »

Subscribe(r, &Reader::ReadMessage);
Тут неясно, если можно, подробнее. Как управление попадет на точку "того самого" ReadMessage?

из &Reader::ReadMessage
получаем список параметров функции.

в случае с туплем получим тип этого тупля.
ну а далее, делегируем вызов функции-хранения,
которая параметризуется типом этого тупля,
передав ей ссылку на подписчика.

поскольку разные параметры туплей - это разные типы туплей,
а разные типы туплей инстанцируют разные функции-хранения,
то по итогу поимеем в одной кучке подписчиков,
которые принимают сообщения одного типа.

далее, при отправке сообщения генерируется тупель,
и зная тип этого тупля, сообщение кидается в кучку этого тупля.
а там сидят подписчики, которые гарантированно умеют прочитать такой тупель.

все проверки типизации получаются времени компиляции.
в рантаме - тупо цикл по всем подписчикам кучки,
которым без всяких проверок дергается метод получения сообщения.

с вариадик-шаблонами все тоже самое.
разный вариадик-пак-аргументы будут инстанцировать разные кучки.

поэтому, функция SendMessage(10, true, "hello");
напрямки запустит цикл только для тех подчисчиков, кто подписался на набор:
void  ReadMessage(const int&, const bool&, const char*)

единственная заморочь со строками:
"hello" - это неизменяемый массив буковок,
а вовсе не указатель на неизменяемый объект.
поэтому, формально набор типов при отправке и получении
может получаться немножко различный.
и это нужно учитывать.
но эта хрень легко разруливается при помощи мета-функций-хелперов.

если не понятно, то чутка попозже будет время,
могу привести простейший хэлло-ворлд с примером-иллюстрацией.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #186 : Октябрь 04, 2015, 03:00 »

Цитировать
в c++03 я делал так:
Ну дык в новом стандарте так можно и без всяких туплей сделать..)

да это все фигня. дизайн и косметика.

лучше вот что расскажите:
как вы без туплей в с++11 сможете забиндить аргументы?

представьте себе: клиент зовет функцию  с аргументами.
нужно запомнить с какими аргументами она была вызвана.

и спустя какое то время,
когда нибудь в будущем запустить нечто с этими аргументами.

если вам запретить использовать std::tuple,
то единственный способ решить эту задачу - либо взять какие нибудь boost::tuple,
либо построить собственный велосипед.

потому что иначе такую задачу решить будет невозможно.
даже если у вас там с++1y

« Последнее редактирование: Октябрь 04, 2015, 03:02 от _Bers » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #187 : Октябрь 04, 2015, 09:43 »

единственная заморочь со строками:
"hello" - это неизменяемый массив буковок,
а вовсе не указатель на неизменяемый объект.
Да, точно - не подумал об этом

если не понятно, то чутка попозже будет время,
могу привести простейший хэлло-ворлд с примером-иллюстрацией.
Было бы очень к месту. Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #188 : Октябрь 04, 2015, 13:15 »

Что вы имеете в виду под Меташаблонами? Если это те, что появились в результате случайной ошибки, то оправдание их использования очень спорно.

detected: ниосилятор

Преимущества в студию, пожалуйста. Только без книжных примеров, а реальные. Или очередной раз пук в лужу?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #189 : Октябрь 04, 2015, 13:57 »

Господа, давайте про сообщения в отдельной теме поговорим, здесь и так уже слишком сильно отклонились от начального обсуждения Улыбающийся. А то ценные сведения могут утонуть в потоке флейма.
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #190 : Октябрь 04, 2015, 21:21 »

Преимущества в студию, пожалуйста. Только без книжных примеров, а реальные. 

полагаю, неосиляторы вроде вас,
это те, остановившиеся в развитии кодерки,
что пишут на "си с классами".

ну так вот вам простой не книжный пример из реальной жизни:
http://www.cplusplus.com/reference/functional/function/function/

Или очередной раз пук в лужу?

фраза построена так, словно существуют предыдущие "пуки в лужу".
однако, вы не сможете привести ни одного такого примера.

моё предыдущие сообщение так же не может являться примером "пука в лужу",
поскольку для всех программистов хотя бы среднего уровня
очевиден профит от возможности метапрограммирования на языке с++.

я уже не говорю о том, что развитие языка с++
в принципе движется в сторону развития технологии шаблонов.

что было добавлено в ядро с++1y ?

auto, decltype, static_assert, constexpr ? не, не слышал.
шаблоно-тайпдефы, лямбды, шаблоно-лямбды ? не, не слышал.
концепты, type_traits ? не, не слышал.

что хотят добавить в с++17 ? статическую рефлексию? не, не слышал.

пуканье в лужу - это например #183
потому что написав такое,
долбодятел расписался в собственном бахвальстве и невежестве:
не знании основ языка
"не знаю, не умею, и знать не хочу" - зато понты выше крыши.

такой кодерок никогда не сможет построить механизмы наподобие:
std::function/std::bind, std::shared_ptr, и др.

он не умеет стандартую библиотеку.

а об этом разделе вообще ни разу не слышал,
а если и слышал, то представления не имеет,
как эти пользоваться:
http://www.cplusplus.com/reference/type_traits/


Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #191 : Октябрь 04, 2015, 22:05 »

полагаю, неосиляторы вроде вас,
это те, остановившиеся в развитии кодерки,
что пишут на "си с классами".

А я полагаю, что теоретики вроде вас ни разу не работали на реальных проектах с большим объемом кода и функционала.
Иначе бы знали, почему "метапрограммирование" на шаблонах в них малоприменимо.
Для вас языки программирования - это предмет для теоретического обсуждения, за которым, как правило, нет ничего из разряда реального применения.
Вы рассыпаетесь книжными фразами и терминами, но не можете ответить на вопросы по существу.
Может это и должно возыметь эффект на джуниоров и студентов, но не все тут такие, поверьте.

Или очередной раз пук в лужу?

Цитировать
фраза построена так, словно существуют предыдущие "пуки в лужу".
однако, вы не сможете привести ни одного такого примера.

Отнюдь.
Ни одного ответа по сути о необходимости приватных методов - раз.
Незнание того, как и для чего используется модификатор const - два.
И это только в этом треде.

Цитировать
моё предыдущие сообщение так же не может являться примером "пука в лужу",
поскольку для всех программистов хотя бы среднего уровня
очевиден профит от возможности метапрограммирования на языке с++.

Опять голословное и бездоказательное утверждение. Впрочем, неудивительно.

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #192 : Октябрь 05, 2015, 01:26 »

А я полагаю, что теоретики вроде вас
полагать - это все, что вы можете.
причем высасываете из пальца
ничем не обоснованные свои влажные фантазии.

однако, скажу по собственному опыту:
"крупными проектами", и "седыми яйцами" - кичаццо в основном только новички.

Отнюдь.
Ни одного ответа по сути о необходимости приватных методов - раз.
просто вы оказались слишком тупой, что бы понять простую вещь:
технической необходимости (ситуации, когда по другому сделать просто не получится) - не существует.

модификаторы public/protected/private были созданы для людей,
как средство обеспечения инкапсуляции (и следовательно - инварианта) классов.

мне лениво объяснять тупым людям, зачем это было нужно.
(все равной не поймут)
я лишь предложил вам самостоятельно почитать об этом,
и не нести всякий бред.

Незнание того, как и для чего используется модификатор const - два.
я не давал вам повода так думать.

я сообщил вам, что квалификатор конст,
точно так же, как и модификаторы доступа public/protected/private
нужен человеку для поддержания пресловутой инкапсуляции,
и обеспечения инвариантов, а не компилятору.

то есть необходимости в нем так же не существует.
вы вполне можете писать код без всяких const.

разумеется, пренебрежительное отношение к инкапсуляции и инвариантам
неизбежно спровоцирует конфликты с нормальным кодом сторонних библиотек,
ну и  говнокод в терминальной стадии.
но это уже проблема говнопрограммистов,
у которых не хватило мазгоф понять,
что такое инкапсуляция,
и зачем она нужна.

технических ограничений язык не накладывает.

Цитировать
моё предыдущие сообщение так же не может являться примером "пука в лужу",
поскольку для всех программистов хотя бы среднего уровня
очевиден профит от возможности метапрограммирования на языке с++.

Опять голословное и бездоказательное утверждение. Впрочем, неудивительно.

понимаете, даже Ватикан уже признал, что земля круглая.

я вам ссылок накидал на стандартную библиотеку,
в которой внезапно полно инструментария для мета-программирования.

ключевых слов c++11 накидал,
которые внезапно завезли для нужд мета-программирования.

механизмы привел из стандартной библиотеки,
которые существуют лишь благодаря возможности мета-программирования.

и вы считаете это - голословным утверждением?

вы какой то реально летящий "сказочный персонаж"
знаете как называют людей, которые отрицают факты?

вы все кичитесь свои "богатым опытом", "крупными проектами",
а сами даже не знаете, зачем нужна инкапсуляция.
ну-ну.

и кстати, не пытайтесь взять меня на понт по части знания стандарта языка.
я уже понял, что ваш уровень - это "си с классами".
на моем поле вы играть все равно не сможете.
слишком плохо знаете язык.

например, предложи вам запилить аналог std::function и std::bind.
вы ж такую задачку уже не осилите.

ну или вот пример, попробуйте ответить на вопросы по коду
http://rextester.com/UICA90733

Код:
#include <iostream>
#include <memory>

struct value
{
    value(const int v1, const int v2)
        :v1(v1),v2(v2)
    {}
    
    // --- назовите причины, почему был использован именно шаблон
    // а не просто std::ostream какой нибудь?
    template<class T>friend ::std::basic_ostream<T>&
    operator<<(::std::basic_ostream<T>& os, const value& obj )
    {
        return os << "value = {"<< obj.v1 << ", " << obj.v2 << "};";
    }

    int v1,v2;
};

struct base
{
    // --- нет виртуального диструктора
    
    // такая ситуация трактуется стандартом языка
    // как UB.
    
    // в случае одиночного наследования
    // провоцирует утечки памяти
    // (вызова диструктора наследника по указателю на базовый класс не происходит)
    
    // в случае с множественным наследованием
    // программа крашется в рантайме на всех топовых компиляторах:
    // (cl/gcc/clang)
    
    virtual void foo()const = 0;
};

struct der: base
{
    // --- тем не менее все равно будет вызван диструктор потомка
   ~der() { std::cout<<"der: dtor\n"; }
    
    der(const int v1, const int v2)
        :v(v1,v2)
    {}
    
    virtual void foo()const
    {
        std::cout << v << '\n';
    }
    
    value v;
};


int main()
{
    std::cout << "Hello, world!\n";
    
    // --- тип смарт-поинтера параметризуется
    // базовым классом
    // у которого нет виртуального диструктора
    const std::shared_ptr<base> shared
        = std::make_shared<der>(10,20);
    
    shared->foo();
    
    // класс std::shared_ptr<base>
    // оперирует указателем на базовый класс base
    // и ничего не знает о его возможных наследниках
    
    // тем не менее, когда время жизни объекта закончится
    // он позавет правильный диструктор потомка
    
    // каким образом он догадыватся, какой нужен диструктор
    // и как вообще он умыдряется его запускать?
}

сейчас я больше чем уверен,
что вы не в состоянии прочитать исходный код std::shared_ptr,
и понять его устройство.

но вы можете попробовать меня переубедить.
(интересно понаблюдать, как вы пойдете в отказ, и начнет отмазываться)

кстати, внезапно std::shared_ptr/std::make_shared
так же использует мета-программирование
для проворачивания всяких штук.

один только инжект счетчиков в объект-ресурс,
который выполняет std::make_shared чего стоит.
по сути получается, что std::make_shared превращает
std::shared_ptr в интрузивный указатель.
« Последнее редактирование: Октябрь 05, 2015, 01:45 от _Bers » Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #193 : Октябрь 05, 2015, 01:44 »

Иначе бы знали, почему "метапрограммирование" на шаблонах в них малоприменимо.

шаблоны выносят в инструментальные библиотеки в силу их "шаблонной" природы:
инструменты для эксплуатации в самых разных проектах.

а вовсе не потому, что компания хочет сыкономить деньги на квалифицированных кадрах,
и поэтому вынужденна нанимать ниосиляторов, таких как вы, которые просто не тянут.
(вы ведь об этом подумали? что якобы шаблонны чрезмерно усложняют понимание кода.)

а вот использование библиотечного шаблоно-класса - да пожалуйста, сплошь и рядом.
армия программистов, включая самых маленьких спокойно используют STL.
многие не в состоянии понять исходный код того же std::vector.

но это не мешает его использовать даже самым юным новобранцам.
просто потому, что благодаря качественной инкапсуляции и инвариантам,
имеем надежный механизм, которым можно пользоваться без необходимости
понимать нюансы.



Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #194 : Октябрь 05, 2015, 09:48 »

Код:
    // класс std::shared_ptr<base>
    // оперирует указателем на базовый класс base
    // и ничего не знает о его возможных наследниках
   
    // тем не менее, когда время жизни объекта закончится
    // он позавет правильный диструктор потомка
   
    // каким образом он догадыватся, какой нужен диструктор
    // и как вообще он умыдряется его запускать?
}
В коде это "присвоение"
Цитировать
call  std::shared_ptr<base>::shared_ptr<base><der> (0F312BCh)
Что отливается в такую бадягу
Цитировать
   template<class _Ty2>
      shared_ptr(shared_ptr<_Ty2>&& _Right,
         typename enable_if<is_convertible<_Ty2 *, _Ty *>::value,
            void>::type ** = 0) _NOEXCEPT
      : _Mybase(_STD forward<shared_ptr<_Ty2> >(_Right))
      {   // construct shared_ptr object that takes resource from _Right
      }
Хмм.. не могу понять какому же конструктору из справочника это соответствует Улыбающийся Это MSVC, хотелось бы  посмотреть шланг, но там отладчик слабенький, не покажет.

Ну ладно, в любом случае как он удаляет ясно: его "deleter" (_Ref_count_obj) инстанциируется типом der (а не base) и зовет деструктор der без затей

Код:
    // --- назовите причины, почему был использован именно шаблон
    // а не просто std::ostream какой нибудь?
    template<class T>friend ::std::basic_ostream<T>&
    operator<<(::std::basic_ostream<T>& os, const value& obj )
Чтобы использовать др "traits", напр уникод
Записан
Страниц: 1 ... 11 12 [13] 14 15 16   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 22.