Войти
ФлеймФорумПрограммирование

Общие вопросы по программированию (507 стр)

Страницы: 1506 507 508 509541 Следующая »
#7590
9:28, 30 сен 2022

Dmitry_Milk
> Это все равно под капотом аналог некоторого виртуального метода, то есть все
> равно сохранение дополнительной инфы в объекте.
Да, такой уникальный указатель будет весить как два обычных. Зато не засоряем сам объект.

Можно, конечно, типизировать сам указатель, что-то вроде такого:

std::vector<std::unique_ptr<MyNode, MyNodeCounterDecrementer>> child_nodes;

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

#7591
11:56, 30 сен 2022

Dmitry_Milk
> Мне тут пришла мысль - все-таки я наверное откажусь от RAII для этого счетчика,
> а просто у рекурсивных виртуальных методов парсинга сделаю возвращаемое
> значение не void а int, обозначающее количество всех дочерних элементов,
> посчитав его как сумму возвратов от всех рекурсивных вызовов парсеров дочерних
> элементов - так это значение станет просто локальным, гарантированно начиная с
> нуля при открытии очередной первой скобки.
AccumT (Sum Int)?

#7592
13:26, 30 сен 2022

Имбирная Ведьмочка
> AccumT (Sum Int)?

Я сейчас пересматриваю "Вавилон-5", там тоже были техномаги, использовавшие гибрид технологий и магических заклинаний.

#7593
14:58, 30 сен 2022
    system_clock::time_point now = system_clock::now();
    chrono::nanoseconds duration = now.time_since_epoch();
    time_t tt = duration_cast<seconds>(duration).count();
    tm utc_tm;
    gmtime_s(&utc_tm, &tt);

Нормуль?
В С++17 можно тоже самое но получше сделать?

#7594
15:24, 30 сен 2022

Ну попробую объяснить по-колхозному.

Вот есть у нас некий тип для аккумуляторных значений - w. К нему прилагается константа, соответствующая нулю - mempty, и операция добавления значения в аккумулятор - (<>). Принимается на веру, что forall x. mempty <> x === x === x <> mempty (ноль не меняет аккумулятор) и forall x y z. (x <> y) <> z === x <> (y <> z) (аккумулируемые значения можно свободно перегруппировывать).

Операция в AccumT w - помимо своих обычных действий, также может добавлять новые элементы в аккумулятор и читать текущее значение полного аккумулятора:

foo :: AccumT (Sum Int) IO String
foo = do
    Sum x <- look
     -- x = 0
    lift $ putStrLn $ "x = " <> show x
    add (Sum 10)
    Sum y <- look
     -- y = 10
    lift $ putStrLn $ "y = " <> show y
    add (Sum 25)
    Sum z <- look
    -- z = 35
    lift $ putStrLn $ "z = " <> show z
    pure "henlo"

main = do
    (r, Sum acc) <- runAccumT foo (Sum 0)
    -- final accum = 35
    putStrLn $ "final accum = " <> show acc
    -- result = "henlo"
    putStrLn $ "result = " <> show r

https://godbolt.org/z/hvcv4zo7h

Механически, AccumT - это функция, которая, помимо обычных параметров, дополнительно принимает на вход значение аккумулятора, которое уже было накоплено к её началу (чтобы правильно работал look), а вместе с результатом - дополнительно возвращает сумму всех добавлений, произошедших внутри этой функции:

newtype AccumT w m a = AccumT
    { runAccumT :: w -> m (a, w)
    }

add :: (Monad m) => w -> AccumT w m ()
add elem = AccumT $ \_ -> pure ((), elem)

look :: (Monoid w, Monad m) => AccumT w m w
look = AccumT $ \acc -> pure (acc, mempty)

Поскольку в результате функция возвращает только свои добавления, не включая предыдущую историю - можно использовать фильтры:

runAccumFilter :: (Monoid w, Monad m) => AccumT w m a -> AccumT w m (a, w)
runAccumFilter act = AccumT $ \initialAccum -> do
    (actResult, actWriting) <- runAccumT act initialAccum
    pure ((actResult, actWriting), mempty)

https://godbolt.org/z/oo7zsrsbK

Соответственно, когда мы переводим AccumT-алгоритм на колхозный язык, у нас получается примерно такой паттерн:

std::pair<RealResult, int> foo(Param param, P2 p2, P3 p3, int initialAccum) {
    int localAccum = 0;
    auto [r1, acc1] = bar1(param, initialAccum);
    localAccum += acc1;
    if (cond2(p2)) {
        auto [r2, acc2] = bar2(p2, initialAccum + localAccum);
        r1.do2(r2);
        localAccum += acc2;
    }
    for (int i = 0; i < count(p3); ++i) {
        auto [r3, acc3] = bar3(p3, initialAccum + localAccum);
        auto [rr, _accr] = foo(param, r3.p2, r3.p3, initialAccum + localAccum + acc3);
        r1.dorr(rr);
        localAccum += 1; // (acc3 + accr) is replaced by 1
    }
    return {r1, localAccum};
}
#7595
(Правка: 20:16) 20:13, 3 окт 2022

Так ли уж "всесилен" ООП?
Десять вещей, которые я терпеть не могу в ООП

P.S. А, кто нибудь, пробовал использовать инструментарий как Pharo, Squeak ... (Smalltalk языковой направленности)?

#7596
21:20, 3 окт 2022

Через что ща на чистом WinAPI можно отправить EMAIL на гугл почту из кода на С++? Чё-то никак не догоню... Какие-то примеры есть с запуском стандартного outlook-а или ещё более вонючее г.мамонта, а чего-то по свежее вообще нету... Сейчас же вроде всё изменилось, нужно делать всякую авторизацию...

#7597
(Правка: 21:31) 21:24, 3 окт 2022

THE_MASTER
> Через что ща на чистом WinAPI можно отправить EMAIL на гугл почту из кода на С++?
вот ништяк библиотека

попробуй ShellExecute(NULL, "open", "mailto:"...);

KPG
> Десять вещей, которые я терпеть не могу в ООП
этой статье уже 12 лет, ООП не помер, а автор статьи покиниул академические круги.

#7598
21:33, 3 окт 2022

skalogryz
> попробуй ShellExecute(NULL, "open", "mailto:"...);
не, ты чё, он браузер или аутлук откроет, мне нужно без стороннего трешацца отправить тупо функцией какой-то...

#7599
(Правка: 21:36) 21:36, 3 окт 2022

THE_MASTER
> не, ты чё, он браузер или аутлук откроет, мне нужно без стороннего трешацца
> отправить тупо функцией какой-то...
я вот эту штуку использовал когда-то https://github.com/muquit/mailsend
всё что тебе нужно убрать её CLI, и использовать оставшийся код.

#7600
22:01, 3 окт 2022

KPG
> Так ли уж "всесилен" ООП?
  Точно так же как демократия - худшая форма правления, если не считать всех остальных, ООП - худшая парадигма после всех остальных. И что бы там ни говорили, а пока альтернатив ему нет. Поэтому вместо того, чтобы кидаться древними статейками сомнительной полезности от таких же недалёких авторов, лучше просто взять и изучить что это такое. Может быть и мозгов прибавится.

THE_MASTER
> не, ты чё, он браузер или аутлук откроет, мне нужно без стороннего трешацца
> отправить тупо функцией какой-то...
  Ну если MAPISENDMAILW не поможет, то я тогда не знаю что тебе ещё надо.

#7601
(Правка: 22:57) 22:42, 3 окт 2022

Zefick
> а пока альтернатив ему нет
Ну как же нет. На го уже несколько лет пилят коммерческий софт (и совсем не расширения ядра ОС). На яве уже многие используют ООП на полшишечки, обходясь чуть расширенным процедурным подходом. На шарпе/юнити много кто вместо классического ООП использует динамическую композицию (с ецс и без). Да и в крестовом геймдеве ецс вроде популярен.

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

#7602
22:47, 3 окт 2022

Zefick
> И что бы там ни говорили, а пока альтернатив ему нет.
А ты уже видел, как весь код в ECS пишут? Вообще весь))

#7603
(Правка: 22:51) 22:50, 3 окт 2022

samrrr
Прям вообще весь? Или ECS пока все ещё является надстройкой на ооп?
Вроде ECS языков пока нет и для рабоы ECS требуется фраймворки которые в основе своей ооп

#7604
22:53, 3 окт 2022

FlyOfFly
> Прям вообще весь?
Вообще всё, от начала и до конца.

FlyOfFly
> Вроде ECS языков пока нет и для рабоы ECS требуется фраймворки которые в основе
> своей ооп
А на чём само ECS не так важно. Как неважно на каком языке и как написан интерпретатор JS.

Страницы: 1506 507 508 509541 Следующая »
ФлеймФорумПрограммирование