Size: a a a

2021 February 22

q

qwerty in supapro.cxx
да, хотел сказать заранее, не бейте за указатели
источник

LA

Liber Azerate in supapro.cxx
ICOcatcher localcoin.is
Исправил код, заработало, каеф
👍
источник

LA

Liber Azerate in supapro.cxx
qwerty
да, хотел сказать заранее, не бейте за указатели
А в иных случаях, ну ты серьёзно? Вкидываешь это, ожидаешь, что кто-то будет вчитываться в это, ожидаешь, что тут сильно что-то понятно без полного кода?
источник

LA

Liber Azerate in supapro.cxx
Ну вижу абстрактную фабрику какую-то. Ну паттерн как паттерн. Шо дальше?
источник

LA

Liber Azerate in supapro.cxx
Что ещё тут сказать не знаю. Можешь дальше ожидать, вдруг кто-то ещё что скажет, хоть я и сомневаюсь
источник

LA

Liber Azerate in supapro.cxx
Пожалуй, вижу странную зависимость от некоего глобального currBank. Насчёт клиента не знаю
источник

G

Garey in supapro.cxx
Всем привет есть C-код:
if (num_channels == 1) {
   size_t num_samples = size_in / sizeof(float);
   for (size_t i = 0; i < num_samples; i += 2) {
     float value = *src++;  // x1 (use)
     ++src;                 // x2 (discard)
     *dst++ = value;
   }
 }

Можно ли так-же сделать с std::vector<float> например каждый 0,2,4...n элемент скопировать в другой vector? std::partition_copy?
источник

LA

Liber Azerate in supapro.cxx
Garey
Всем привет есть C-код:
if (num_channels == 1) {
   size_t num_samples = size_in / sizeof(float);
   for (size_t i = 0; i < num_samples; i += 2) {
     float value = *src++;  // x1 (use)
     ++src;                 // x2 (discard)
     *dst++ = value;
   }
 }

Можно ли так-же сделать с std::vector<float> например каждый 0,2,4...n элемент скопировать в другой vector? std::partition_copy?
источник

G

Garey in supapro.cxx
спасибо
источник

G

Garey in supapro.cxx
Но там именно что внутри массива. А мне именно индексы нужны 0,2,4 и т.д.
источник

G

Garey in supapro.cxx
некий счетчик сделать и с ним сравнивать в predicate?
источник

LA

Liber Azerate in supapro.cxx
Garey
Но там именно что внутри массива. А мне именно индексы нужны 0,2,4 и т.д.
[cnt = 0](const auto& el) mutable {
  return !(cnt++ % 2);
}
источник

ПК

Побитый Кирпич... in supapro.cxx
qwerty
AccountFactory* currAccountFactory = new CreditAccountFactory();
       currBankChain->createAccount(currBank, client1, currAccountFactory->createAccount());
       currAccountFactory = new DebitAccountFactory();
       currBankChain->createAccount(currBank, client1, currAccountFactory->createAccount());
       currAccountFactory = new DepositAccountFactory();
       currBankChain->createAccount(currBank, client1, currAccountFactory->createAccount());
Утечки памяти
источник

ПК

Побитый Кирпич... in supapro.cxx
Liber Azerate
[cnt = 0](const auto& el) mutable {
  return !(cnt++ % 2);
}
mutable
источник

O

Ofee in supapro.cxx
Mikhail Kalugin
Вот кстати, интересно стало: в C++ шаблоны всегда инвариантны или есть какой-то способ это обойти?
Если я правильно понял саму концепцию (без подготовки сходу оказалось непросто переложить концепцию полиморфизма через трейты на плюсовый полиморфизм через наследование), то можно сделать CRTP-обёртку, которая заставит наши типы вести себя как какой-то другой тип (например, какой-нибудь из стандартных контейнеров). Вот пример реализации такой обёртки для контейнеров. Новый контейнер, поддерживающий выбор вариантности пишется в 4 строки, ведя при этом как настоящий. При желании можно и что-то более обобщённое написать

Ну и очевидное наблюдение — стандартные умные указатели изначально не инвариантны ¯\_(ツ)_/¯

На что я только убил последние часа 3 своего существования...
источник

FD

Fake Dude in supapro.cxx
Ofee
Если я правильно понял саму концепцию (без подготовки сходу оказалось непросто переложить концепцию полиморфизма через трейты на плюсовый полиморфизм через наследование), то можно сделать CRTP-обёртку, которая заставит наши типы вести себя как какой-то другой тип (например, какой-нибудь из стандартных контейнеров). Вот пример реализации такой обёртки для контейнеров. Новый контейнер, поддерживающий выбор вариантности пишется в 4 строки, ведя при этом как настоящий. При желании можно и что-то более обобщённое написать

Ну и очевидное наблюдение — стандартные умные указатели изначально не инвариантны ¯\_(ツ)_/¯

На что я только убил последние часа 3 своего существования...
А можно для самых маленьких, в чем там неинвариантность?
источник

FD

Fake Dude in supapro.cxx
И насколько это корректно использовать понятие инвариантности в контексте шаблонов, а не конечных инстансов?
источник

O

Ofee in supapro.cxx
Fake Dude
А можно для самых маленьких, в чем там неинвариантность?
По умолчанию все инстансы шаблонов в C++ инвариантны и следующий код не работает
std::vector<Base> x = std::vector<Derived>{};

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

FD

Fake Dude in supapro.cxx
Ofee
По умолчанию все инстансы шаблонов в C++ инвариантны и следующий код не работает
std::vector<Base> x = std::vector<Derived>{};

Я привёл пример обёртки, которая позволяет написать свои контейнеры, позволяющие выбрать поведение одним из двух способов (указать, что исходный вектор ковариантен или указать, что вектор назначения контравариантен)
Я так и думал, спасибо. Только вашем примере разные  инстансы, а не шаблоны)
источник

O

Ofee in supapro.cxx
Fake Dude
И насколько это корректно использовать понятие инвариантности в контексте шаблонов, а не конечных инстансов?
Насколько я понял, в Scala вариантность описывается в терминах (под)типов. Так или иначе, инстанс принадлежит одному из типов (аннотированных или нет), которые и определяют поведение между типами и подтипами

Точнее, вместо подтипов я взял operator T, посчитав его более мощным инструментом
источник