gpt4 book ai didi

处理 STL 容器时的 C++ 类特化

转载 作者:行者123 更新时间:2023-11-30 02:07:53 25 4
gpt4 key购买 nike

我想要一个函数来返回基本类型对象的字节大小。我还希望它以字节为单位返回 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>案例?

谢谢!

最佳答案

相应地修改了您的代码:

/// 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] );
}

请注意,如果使用空的 vector 调用 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;
}

关于处理 STL 容器时的 C++ 类特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com