Лучший способ инициализировать член статического массива класса в С++ (предпочтительнее использовать const)

У меня есть статический массив указателей на функции как член класса.

Мне нужно его инициализировать, но оказалось, что этот массив имеет длину 64 КБ, поэтому нецелесообразно инициализировать его статическим инициализатором, таким как { x, y, z, ... }, так как это загромождает код.

Вместо этого я должен инициализировать его кодом с несколькими циклами.

Как я понял, это можно сделать, инициализировав массив static в конструкторе и установив для него флаг, чтобы только конструкция первого экземпляра класса запускала эту инициализацию.

Также доступ к этому статическому флагу из экземпляров не будет потокобезопасным, но это уже другая история.

Есть ли более чистый или лучший способ сделать это?

Я также хотел бы, чтобы этот массив был const, но я боюсь, что единственный способ сделать это с инициализацией static {}, верно?


person Petruza    schedule 12.11.2011    source источник
comment
64 тысячи функций? Кроме того, как вы можете сделать это в цикле, если у каждой функции есть имя?   -  person Seth Carnegie    schedule 13.11.2011
comment
Генерация кода, чувак. Перл, питон, что угодно.   -  person Nikolai Fetissov    schedule 13.11.2011
comment
Мне действительно интересно, как вы собираетесь получить все эти адреса функций без того же беспорядка, что и с { &nitializer, &lists }? AFAIK С++ не имеет отражения?   -  person sehe    schedule 13.11.2011
comment
@Nikolai да, ты прав, я думал сделать это в отдельном #included файле   -  person Petruza    schedule 14.11.2011
comment
@Seth нет, в массиве 64 тыс. элементов, и тип массива - указатель на функцию, поэтому это 65536 указателей на функции. Существует около 8 уникальных функций, на которые массив будет указывать в отношении N к 1.   -  person Petruza    schedule 14.11.2011


Ответы (2)


Другим вариантом может быть использование генерации кода: напишите отдельную программу, которая генерирует исходный код для определения статического массива.

person celtschk    schedule 12.11.2011

Возможно, не самый чистый код, но как насчет того, чтобы сделать массив элементов статической ссылкой;

заголовочный файл:

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). Это часть TR1. Основную информацию о TR1 можно найти в википедии, его документация в Boost.

person Adam Trhon    schedule 12.11.2011
comment
спасибо, но поскольку это должен быть фиксированный массив из 65536 элементов и прямой произвольный доступ, поэтому нет необходимости в std::vector. - person Petruza; 14.11.2011