GetInstance( index ) = T{ std::forward<Args>( args )... };
T* instance = &GetInstance( index );
instance->~T();
new( instance ) T{ std::forward<Args>( args )... };
new
в никуда, который рискует быть вырезанным в результате оптимизации и явный вызов деструктора - это проще? std::aligned_storage
. buffer[sizeof(T) * head]
давай подскажу еще один подход.struct alignas( 16 ) Vector2 final
{
float x;
float y;
};
sizeof(T) * head
найдет для него неправильное место, не выравненное. А ведь выравнивание может быть и на 64, и на 128, и на 256 байт.std::aligned_storage
{?] в качестве ячейки своего ЦБ. if (size < maxSize)
и для чего существует второй - который под первым.size
и maxSize
. А так же - почему функция называется add
и имеет такие параметры.GetComputerNameA
- именно BOOL
.BOOL
является псевдонимом для int
, значение которого неявно приводится к char
чтобы соответствовать одной из перегрузок operator =
у std::string
.'\01'
или '\00'
внутри. Но к ошибке трансляции это не приводит потому что все спокойно неявно приводится.'FIO'
имеет, внезапно, тип int
и значение примерно 4606287
.unsigned char
не подходит для подмены. Стандартом разрешены только char
и std::byte
.uint8_t
или чем-то подобным.
Чтобы SFINAE работал, его условие должно зависеть от параметров шаблона функции, поэтому их важно оформить именно как шаблоны функций даже если ты решишь сделать их статическими функциями шаблона ЦБ.