Именно поэтому я даже предположить не мог, что объект с указателем формально может считаться тривиальным.
Если он владеет объектом, то, по определению (из данной вами ссылки), не может быть тривиальным, потому что у него будет нетривиальный конструктор копирования и деструктор (не рассматриваем вариант с утечкой памяти).
Сам по себе указатель - тривиальный тип
но класс, содержащий указатель (и владещющий адресуемым объектом) не является тривиальным типом.
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>
- это все полностью разные типы, хоть они и инстанцированы из одного шаблона. Твоя задача шаблонами решается очень криво и приводит к тому, что единой иерархии типов у тебя не будет.
Чрезмерная опека, чем и являются подобные смещения смысловых надстроек в область стандартов, всегда приводит людей к бессознательному соблюдению определенных ритуалов. Своеобразный карго-культ. В результате, конкретно в этой ситуации, слабо квалифицированный человек может прочитать твои слова и подумать что он вообще и всегда будет защищен со стороны
std::is_trivial
. И это будет ошибкой.