Лучший способ инициализировать член статического массива класса в C++ (хотя предпочтительнее использовать const)
У меня есть статический массив указателей на функции в качестве члена класса.
Мне нужно его инициализировать, но оказывается, что этот массив имеет длину 64 КБ, поэтому нецелесообразно инициализировать его статическим инициализатором, таким как { x, y, z, ... }
как бы загромождать код.
Вместо этого я должен инициализировать его с помощью кода с несколькими циклами.
Я рассчитывал сделать это путем инициализации static
массив в конструкторе и установка для него флага, поэтому только конструкция первого экземпляра класса будет запускать эту инициализацию.
Доступ к этому статическому флагу изнутри экземпляров не будет безопасным для потоков, но это уже другая история.
Есть ли более чистый или лучший способ сделать это?
Я также хотел бы, чтобы этот массив был const
, но я боюсь, что единственный способ сделать это с static {}
инициализация, верно?
2 ответа
Другой вариант - использовать генерацию кода: напишите отдельную программу, которая генерирует исходный код для определения статического массива.
Возможно, не код cleaniest, а как насчет того, чтобы сделать массив-член статической ссылкой;
заголовочный файл:
class MyClass
{
...
static const std::vector<pointer to member>& pointer_vector;
};
файл реализации:
namespace
{
typedef std::vector<pointer to member> t_pointer_vector;
t_pointer_vector pointer_vector;
const t_pointer_vector& initialize_pointer_vector(void)
{
//generate pointer_vector
return pointer_vector;
}
}
t_pointer_vecotor& MyClass::pointer_vector = initialize_pointer_vector();
Если не хочешь std::vector
Вы можете взглянуть на std::tr1::array
массив с фиксированным размером, который безопаснее и не менее эффективен, чем массив в стиле C (согласно Boost doc). Это часть TR1. Основную информацию о TR1 можно найти в Википедии, ее документация в разделе Boost.