template< typename TElement >
class Span final
{
public:
Span() = default;
Span( const Span& ) = default;
Span( Span&& ) = default;
Span( TElement* memory, const size_t length )
: m_memory{ memory }
, m_length{ length }
{}
public:
inline const size_t size() const { return m_length; };
inline TElement* begin() const { return m_memory; };
inline TElement* end() const { return m_memory + m_length; };
inline TElement* operator [] ( const size_t index ) const
{
return m_memory[ index ];
}
private:
TElement* m_memory = nullptr;
size_t m_length = 0;
};
virtual Span<int> GetMetrics() const = 0;
и правильно реализовать его в дочерних типах.class A1 : public A<1>
означает что A1
наследуется от инстанцирования шаблона A
с аргументом 1
.A<1>
, A<2>
, A<42>
- это все полностью разные типы, хоть они и инстанцированы из одного шаблона. Твоя задача шаблонами решается очень криво и приводит к тому, что единой иерархии типов у тебя не будет. Token
, который не может бросать исключений, который инициализирует поле m_kind
значением аргумента kind
и имеет при этом пустое тело.write
для своей работы принимает указатель на блок памяти и размер этого блока для записи в файл. Поведение функции названо UnformattedOutputFunction, т.е. функция не разбирается в структуре памяти, которую ей передали.Car
и создать функцию правильной записи экземпляров этого типа в файл, в правильном порядке записывая данные экземпляра в файл. Эта твоя функция будет задавать формат файла, из которого ты сможешь читать данные в другой экземпляр типа Car
с помощью второй функции чтения формата, которую тебе тоже нужно создать самому.sizeof(Car)
байт, ни байтом больше, ни байтом меньше. На запись ты отдаешь указатель на память экземпляра Car
.fout.write((char*)&newcar, sizeof(Car));
QThread
- это и есть абстракция потока.