Как подавить автоматическую инициализацию и уничтожение типа?Хотя замечательно, что T buffer[100]
автоматически инициализирует все элементы buffer
и уничтожает их, когда они выпадают из области видимости, такое поведение я не хочу.
#include <iostream>
static int created = 0,
destroyed = 0;
struct S
{
S()
{
++created;
}
~S()
{
++destroyed;
}
};
template <typename T, size_t KCount>
class fixed_vector
{
private:
T m_buffer[KCount];
public:
fixed_vector()
{
// some way to suppress the automatic initialization of m_buffer
}
~fixed_vector()
{
// some way to suppress the automatic destruction of m_buffer
}
};
int main()
{
{
fixed_vector<S, 100> arr;
}
std::cout << "Created:\t" << created << std::endl;
std::cout << "Destroyed:\t" << destroyed << std::endl;
return 0;
}
Вывод этой программыэто:
Created: 100
Destroyed: 100
Мне бы хотелось, чтобы это было:
Created: 0
Destroyed: 0
Моя единственная идея - сделать m_buffer
неким тривиально сконструированным и разрушенным типом, таким как char
, а затем положиться наoperator[]
обернуть мне указатель по математике, хотя это кажется ужасно взломанным решением.Другим решением было бы использовать malloc
и free
, но это дает уровень косвенности, которого я не хочу.
Причина, по которой я этого хочу, заключается в том, что я делаю контейнер иЯ не хочу платить за инициализацию тех вещей, которые я не буду использовать.Например, если моя функция main
была:
int main()
{
{
std::vector<S> vec;
vec.reserve(50);
}
std::cout << "Created:\t" << created << std::endl;
std::cout << "Destroyed:\t" << destroyed << std::endl;
return 0;
}
Вывод будет правильным:
Created: 0
Destroyed: 0