std::vector <std::vector <myType::myRGB>>std::lock_guard является реализацией идиомы Scope Guard - прикладного шаблона, суть которого состоит в гарантии освобождения ресурса при выходе из области видимости функции.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));