这基本上与 litb 的答案相同,但也显示了如何在不对数组大小进行硬编码的情况下将大小相加。这就是为什么它看起来如此复杂。
目前尚不清楚您需要帮助的部分。下面是如何使用类型来跟踪所有元数据而不是内存中的数组。这允许使用枚举进行编译时检查,而您不能在结构中使用 const int 进行检查。如果您有更多元数据,请在设置模板中添加其他参数并将它们存储为枚举值。
使用 Loki 库: http://loki-lib.sourceforge.net/index.php?n= Main.Development。由于 MakeTypeList 的实现方式,它被限制为 18 个“设置”。
您可以使用TypeAt<TList, index>::Result::size_bytes
(例如)访问元数据。
#include "loki-0.1.7\include\loki\typelist.h"
#include "loki-0.1.7\include\loki\static_check.h"
using namespace Loki;
using namespace Loki::TL;
// based on the Length<> template from loki for adding up the sizes
template <class TList> struct TotalSize;
template <> struct TotalSize<NullType>
{ enum { value = 0 }; };
template <class T, class U>
struct TotalSize< Typelist<T, U> >
{ enum { value = T::size_bytes*T::num_items + TotalSize<U>::value }; };
// struct for holding the sizes (and other meta data
// if you add extra template args and enum values)
template <size_t s, size_t n> struct Settings
{ enum { size_bytes = s, num_items = n }; };
// the table of setting structs (limited to 18)
typedef MakeTypelist< Settings<5,1>, Settings<1,2>, Settings<1,1> >
SettingsSuT;
int _tmain(int argc, _TCHAR* argv[])
{
LOKI_STATIC_CHECK(TotalSize< SettingsSuT::Result >::value == 8,is8);
// this will trigger at compile time if uncommented
//LOKI_STATIC_CHECK(TotalSize< SettingsSuT::Result >::value != 8,isnt8);
int x = TotalSize< SettingsSuT::Result >::value;
return 0;
}