Size: a a a

2020 July 21

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
std::slavik
вопрос - есть абстрактный класс Stream:
class Stream : public FileLike, private NonCopyable<Stream> {
...
protected:
   virtual int _putc(int c) = 0;
   virtual int _getc() = 0;
   virtual void lock()
   {
   }
   virtual void unlock()
   {
   }
...
от этого класса наследуются классы в которых уже конкретная реализация Serial порта, например
class USBSerial: public USBCDC, public mbed::Stream
{...}

Как мне сделать так чтобы я определил перегрузку lock()/unlock() в одном месте и для всех классов наследников Stream ее использовал?
Думал что-то вроде такого, но ругается что я не определил в этом классе конструктор с нужной сигнатурой
template <typename T>
class MySerial : public T {
protected:
 void lock(void) override { mutex_.lock(); }
 void unlock(void) override { mutex_.unlock(); }
private:
 Mutex mutex_;
};

конструкторы могут быть разные - в зависимости от реализации, например:
Serial pc_serial(PC_6, PC_7, 250000);
USBSerial pc_serial(true, 0x1f00, 0x2012, 0x0001);

Как сделать так чтобы у наследованного класса появились конструкторы базового?
using T::T;
источник

s

std::slavik in supapro.cxx
std::slavik
вопрос - есть абстрактный класс Stream:
class Stream : public FileLike, private NonCopyable<Stream> {
...
protected:
   virtual int _putc(int c) = 0;
   virtual int _getc() = 0;
   virtual void lock()
   {
   }
   virtual void unlock()
   {
   }
...
от этого класса наследуются классы в которых уже конкретная реализация Serial порта, например
class USBSerial: public USBCDC, public mbed::Stream
{...}

Как мне сделать так чтобы я определил перегрузку lock()/unlock() в одном месте и для всех классов наследников Stream ее использовал?
Думал что-то вроде такого, но ругается что я не определил в этом классе конструктор с нужной сигнатурой
template <typename T>
class MySerial : public T {
protected:
 void lock(void) override { mutex_.lock(); }
 void unlock(void) override { mutex_.unlock(); }
private:
 Mutex mutex_;
};

конструкторы могут быть разные - в зависимости от реализации, например:
Serial pc_serial(PC_6, PC_7, 250000);
USBSerial pc_serial(true, 0x1f00, 0x2012, 0x0001);

Как сделать так чтобы у наследованного класса появились конструкторы базового?
class SerialLogger : public ILogging, public Singleton<SerialLogger> {...
разве что вот-такое что-то пока на ум приходит
источник

ПК

Побитый Кирпич... in supapro.cxx
tamtakoe
Там дэк указателей. Теперь точно перед переменными буду префикс p указывать)
А зачем тебе дек указателей?
источник

s

std::slavik in supapro.cxx
по типу Singleton как использую, но тогда придется для каждого класса создавать такое, хочется чисто чтобы вот такое написал и все
static MySerial<USBSerial> pc_serial(true, 0x1f00, 0x2012, 0x0001);
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
std::slavik
class SerialLogger : public ILogging, public Singleton<SerialLogger> {...
разве что вот-такое что-то пока на ум приходит
Если тебе нужно включить конструкторы базового класса в наследник. Юзай using T::T;
источник

s

std::slavik in supapro.cxx
крутяк
источник

s

std::slavik in supapro.cxx
спасибо
источник

t

tamtakoe in supapro.cxx
Побитый Кирпич
А зачем тебе дек указателей?
Нужно отсортировать массив элементов, не меняя начальный массив. Не копировать же элементы по значению
источник

s

std::slavik in supapro.cxx
template <typename T>
class Serial : public T {
public:
 using T::T;
protected:
 void lock(void) override { mutex_.lock(); }
 void unlock(void) override { mutex_.unlock(); }
private:
 Mutex mutex_;
};
типа такого, вроде скомпилилось
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
tamtakoe
Нужно отсортировать массив элементов, не меняя начальный массив. Не копировать же элементы по значению
А почему дека?
источник

t

tamtakoe in supapro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему дека?
Хз) Переделываю пример, который мне прислали. По идее там нужны только операции добавления в конец и перебора элементов. Почему бы и не дека?
источник

t

tamtakoe in supapro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
А почему дека?
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
tamtakoe
Хз) Переделываю пример, который мне прислали. По идее там нужны только операции добавления в конец и перебора элементов. Почему бы и не дека?
Для сортировки можно std::vector заюзать и std::sort
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
Ну это можно быстро написать в принципе
источник

t

tamtakoe in supapro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Ну это можно быстро написать в принципе
Я тоже так думал) На JS за 5 мин написал.
Видимо, не всё так просто, раз только один человек хоть что-то очень упрощенное написал, а с этого чата, вообще, никто не взялся
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
tamtakoe
Я тоже так думал) На JS за 5 мин написал.
Видимо, не всё так просто, раз только один человек хоть что-то очень упрощенное написал, а с этого чата, вообще, никто не взялся
Ну items как у вас выглядят?
источник

t

tamtakoe in supapro.cxx
🎄🎊 R 🎅 Tb| ✡️ 🎊🎄
Ну items как у вас выглядят?
/**
* Group items by field
*
* items =
*   [{id: 1, name: 'A', i: 1}, {id: 2, name: 'B', i: 2}, {id: 3, name: 'A', i: 3}, {id: 4, name: 'B', i: 4}, {id: 5, name: 'A', i: 5}]
*
* groupByField(items, 'name', ['i']) =
*   [
*     {
*       groupField: 'name',
*       groupValue: 'A',
*       items: [{id: 1, name: 'A', i: 1}, {id: 3, name: 'A', i: 3}, {id: 5, name: 'A', i: 5}],
*       id: 1, //First value
*       i: 9   //Summed value
*     }, {
*       groupField: 'name',
*       groupValue: 'B',
*       items: [{id: 2, name: 'B', i: 2}, {id: 4, name: 'B', i: 4}],
*       id: 2,
*       i: 6
*     }
*   ]
*
* @param items - Array<any> - items array
* @param field - string - field name
* @param sumFields - Array<string> - array with names of fields which should be summed
* @returns Array<any>
*/
Т.е. это массив мап, содержащих строки, цифры или булевы значения (Js-ные типы, в общем)
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
tamtakoe
/**
* Group items by field
*
* items =
*   [{id: 1, name: 'A', i: 1}, {id: 2, name: 'B', i: 2}, {id: 3, name: 'A', i: 3}, {id: 4, name: 'B', i: 4}, {id: 5, name: 'A', i: 5}]
*
* groupByField(items, 'name', ['i']) =
*   [
*     {
*       groupField: 'name',
*       groupValue: 'A',
*       items: [{id: 1, name: 'A', i: 1}, {id: 3, name: 'A', i: 3}, {id: 5, name: 'A', i: 5}],
*       id: 1, //First value
*       i: 9   //Summed value
*     }, {
*       groupField: 'name',
*       groupValue: 'B',
*       items: [{id: 2, name: 'B', i: 2}, {id: 4, name: 'B', i: 4}],
*       id: 2,
*       i: 6
*     }
*   ]
*
* @param items - Array<any> - items array
* @param field - string - field name
* @param sumFields - Array<string> - array with names of fields which should be summed
* @returns Array<any>
*/
Т.е. это массив мап, содержащих строки, цифры или булевы значения (Js-ные типы, в общем)
Я понял. Я про то как у вас в плюсах это выглядит
источник

D

Danya in supapro.cxx
Знатоки VS хелп
Я с тем же вопросом: почему может не работать автодополнение в хедере?
Работает автодополнение инклюдов, но символы из этих инклюдов не подтягиваются
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in supapro.cxx
tamtakoe
/**
* Group items by field
*
* items =
*   [{id: 1, name: 'A', i: 1}, {id: 2, name: 'B', i: 2}, {id: 3, name: 'A', i: 3}, {id: 4, name: 'B', i: 4}, {id: 5, name: 'A', i: 5}]
*
* groupByField(items, 'name', ['i']) =
*   [
*     {
*       groupField: 'name',
*       groupValue: 'A',
*       items: [{id: 1, name: 'A', i: 1}, {id: 3, name: 'A', i: 3}, {id: 5, name: 'A', i: 5}],
*       id: 1, //First value
*       i: 9   //Summed value
*     }, {
*       groupField: 'name',
*       groupValue: 'B',
*       items: [{id: 2, name: 'B', i: 2}, {id: 4, name: 'B', i: 4}],
*       id: 2,
*       i: 6
*     }
*   ]
*
* @param items - Array<any> - items array
* @param field - string - field name
* @param sumFields - Array<string> - array with names of fields which should be summed
* @returns Array<any>
*/
Т.е. это массив мап, содержащих строки, цифры или булевы значения (Js-ные типы, в общем)
Например для того чтобы достать все уникальные id можно написать что-то такое:
std::set<std::string> ids;
std::foreach(items.begin(), items.end(), [](auto &&el) {
 std::visit(el[“items”], [] (auto &&variant_val) {
if constexpr(std::is_same_v<decltype(variant_val), std::string>) {
ids.insert(variant_val);
}
}
});
источник