Специализация класса C ++ при работе с контейнерами STL - PullRequest
1 голос
/ 18 сентября 2011

Я бы хотел, чтобы функция возвращала размер в байтах объекта для фундаментальных типов. Я также хотел бы, чтобы он возвращал общий размер в байтах контейнера STL. (Я знаю, что это не обязательно размер объекта в памяти, и это нормально).

С этой целью я кодировал пространство имен memorysize с функцией bytes так, чтобы memorysize::bytes(double x) = 8 (на большинстве компиляторов).

Я специализировал его для правильной обработки std::vector<double> типов, но я не хочу кодировать разные функции для каждого класса формы std::vector<ANYTHING>, так как мне изменить шаблон для правильной обработки этого случая?

Вот рабочий код:

#include <iostream>
#include <vector>

// return the size of bytes of an object (sort of...)
namespace memorysize
{

  /// general object
  template <class T>
  size_t bytes(const T & object)
  {
    return sizeof(T);
  }

  /// specialization for a vector of doubles
  template <>
  size_t bytes<std::vector<double> >(const std::vector<double> & object)
  {
    return sizeof(std::vector<double>) + object.capacity() * bytes(object[0]);
  }

  /// specialization for a vector of anything???

}


int main(int argc, char ** argv)
{

  // make sure it works for general objects
  double x = 1.;
  std::cout << "double x\n";
  std::cout << "bytes(x) = " << memorysize::bytes(x) << "\n\n";

  int y = 1;
  std::cout << "int y\n";
  std::cout << "bytes(y) = " << memorysize::bytes(y) << "\n\n";

  // make sure it works for vectors of doubles
  std::vector<double> doubleVec(10, 1.);
  std::cout << "std::vector<double> doubleVec(10, 1.)\n";
  std::cout << "bytes(doubleVec) = " << memorysize::bytes(doubleVec) << "\n\n";

  // would like a new definition to make this work as expected
  std::vector<int> intVec(10, 1);
  std::cout << "std::vector<int> intVec(10, 1)\n";
  std::cout << "bytes(intVec) = " << memorysize::bytes(intVec) << "\n\n";

  return 0;
}

Как изменить спецификацию шаблона, чтобы учесть более общий случай std::vector<ANYTHING>?

Спасибо!

1 Ответ

4 голосов
/ 18 сентября 2011

Соответственно изменил ваш код:

/// specialization for a vector of anything
template < typename Anything >
size_t bytes(const std::vector< Anything > & object)
{
  return sizeof(std::vector< Anything >) + object.capacity() * bytes( object[0] );
}

Обратите внимание, что теперь у вас возникла проблема при вызове bytes с пустым vector.

Редактировать: Сотрите это.Если я правильно помню ваш предыдущий вопрос, то, если вы получите вектор строк, вы бы хотели принять во внимание размер каждой строки.Так что вместо этого вы должны сделать

/// specialization for a vector of anything
template < typename Anything >
size_t bytes(const std::vector< Anything > & object)
{
  size_t result = sizeof(std::vector< Anything >);

  foreach elem in object
       result += bytes( elem );

  result += ( object.capacity() - object.size() ) * sizeof( Anything ).

  return result;
}
...