У меня есть класс со статическим методом, который имеет локальную статическую переменную. Я хочу, чтобы эта переменная была вычислена / оценена один раз (в первый раз, когда я вызываю функцию), и для любого последующего вызова она больше не оценивается. Как это сделать? Вот мой класс:
template<
typename T1 = int, unsigned N1 = 1,
typename T2 = int, unsigned N2 = 0,
typename T3 = int, unsigned N3 = 0,
typename T4 = int, unsigned N4 = 0,
typename T5 = int, unsigned N5 = 0,
typename T6 = int, unsigned N6 = 0,
typename T7 = int, unsigned N7 = 0,
typename T8 = int, unsigned N8 = 0,
typename T9 = int, unsigned N9 = 0,
typename T10 = int, unsigned N10 = 0,
typename T11 = int, unsigned N11 = 0,
typename T12 = int, unsigned N12 = 0,
typename T13 = int, unsigned N13 = 0,
typename T14 = int, unsigned N14 = 0,
typename T15 = int, unsigned N15 = 0,
typename T16 = int, unsigned N16 = 0>
struct GroupAlloc
{
static const uint32_t sizeClass;
static uint32_t getSize()
{
static uint32_t totalSize = 0;
totalSize += sizeof(T1)*N1;
totalSize += sizeof(T2)*N2;
totalSize += sizeof(T3)*N3;
totalSize += sizeof(T4)*N4;
totalSize += sizeof(T5)*N5;
totalSize += sizeof(T6)*N6;
totalSize += sizeof(T7)*N7;
totalSize += sizeof(T8)*N8;
totalSize += sizeof(T9)*N9;
totalSize += sizeof(T10)*N10;
totalSize += sizeof(T11)*N11;
totalSize += sizeof(T12)*N12;
totalSize += sizeof(T13)*N13;
totalSize += sizeof(T14)*N14;
totalSize += sizeof(T15)*N15;
totalSize += sizeof(T16)*N16;
totalSize = 8*((totalSize + 7)/8);
return totalSize;
}
};
EDIT:
Спасибо всем за оперативную помощь. +1 каждому. Я выбрал ответ Тайлера МакГенри, потому что он не нуждается ни в каком сравнении, просто в статической оценке функций. Мне понадобится этот код для распределителя, поэтому лучше избегать другого «если». Еще раз спасибо!
EDIT:
Ответ gf оказался лучшим, поскольку он имеет дело с присваиванием во время компиляции и спасает программу от поточно-ориентированной головной боли и явной инициализации. Тем не менее, я уважаю предыдущий лучший ответ. Я дам кредит здесь вместо того, чтобы менять отметку. Спасибо всем за помощь!