Лучший способ инициализировать член статического массива класса в 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.

Другие вопросы по тегам