Я бы хотел, чтобы функция возвращала размер в байтах объекта для фундаментальных типов. Я также хотел бы, чтобы он возвращал общий размер в байтах контейнера 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>
?
Спасибо!