@dansheb

Размер класса в контейнере (например std::vector)

Хочется узнать размер(sizeof) класса, который хранится в контейнере (например std::vector).

Если контейнер не пуст, то это элементарно. Я вижу такое решение:

std::vector<int> v;
if(v.size > 0){
    std::cout << sizeof(v[0]) << std::endl;
}else{
//эта часть смущает
    v.push_back(0);
    std::cout << sizeof(v[0]) << std::endl;
    v.clear();
}

или просто
std::vector<int> v;
v.push_back(0);
std::cout << sizeof(v[0]) << std::endl;
v.pop_back();


Минусы обоих подходов:
1. Если наш класс не int и у него нет конструктора по умолчанию, то не понятно, что передавать как аргумент push_back().
2. Так же, если это обернуть методом класс, то этот метод нельзя сделать const, что не логично, так как метод по идее не должен менять члены класса.
3. На самом деле, мы можем изменить этим v. Может поменяться v.capacity(). Конечно можно сохранить v.capacity() до, а потом востановить её через v.reserve() (но это совсем не дело)

P.S. Столкнулся с этой проблемой при написании метода/функции которая сохраняет массив в бинарный файл в формате:
размер элемент1 элемент2 ... элементN
а потом считывает его.
  • Вопрос задан
  • 2673 просмотра
Решения вопроса 1
@zvorygin
А такое подойдет? -

typedef std::vector<int> my_container;
my_container v;
size_t size = sizeof(my_container::value_type);

Т.е. отталкиваться не от значений а от типа - что должно быть правильнее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы