Получение шаблонных констант времени компиляции метапрограммирования во времени выполнения

Одна вещь, которую вы можете сделать, это отключить кнопку ОК на 3 секунды.

Firefox делает это при установке расширения.

Редактировать: Хорошо, некоторые люди находят это раздражающим. Я все еще думаю, что около 1 секунды будет в порядке. Это подавит инстинкт мгновенного нажатия кнопки «ОК», который есть у людей (включая меня), и вынудит их принять двойное решение. Конечно, даже это будет раздражать людей, если ваш диалог - это не то, что им действительно нужно читать.

43
задан GManNickG 25 May 2009 в 22:24
поделиться

2 ответа

template <unsigned long N>
struct Fibonacci
{
    enum
    {
        value = Fibonacci<N-1>::value + Fibonacci<N-2>::value
    };
    static void add_values(vector<unsigned long>& v)
    {
        Fibonacci<N-1>::add_values(v);
        v.push_back(value);
    }
};

template <>
struct Fibonacci<0>
{
    enum
    {
        value = 0
    };
    static void add_values(vector<unsigned long>& v)
    {
        v.push_back(value);
    }

};

template <>
struct Fibonacci<1>
{
    enum
    {
        value = 1
    };
    static void add_values(vector<unsigned long>& v)
    {
        Fibonacci<0>::add_values(v);
        v.push_back(value);
    }
};



int main()
{
    vector<unsigned long> fibonacci_seq;
    Fibonacci<45>::add_values(fibonacci_seq);
    for (int i = 0; i <= 45; ++i)
        cout << "F" << i << " is " << fibonacci_seq[i] << '\n';
}

После долгих размышлений над проблемой я пришел к следующему решению. Конечно, вам все равно придется добавлять значения в контейнер во время выполнения, но (что важно) они не вычисляются во время выполнения.

В качестве примечания, важно не определять Фибоначчи <1> выше Фибоначчи <0> , иначе ваш компилятор запутает , когда он разрешит вызов Фибоначчи <0> :: add_values ​​, поскольку специализация шаблона Fibonacci <0> не указана.

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

28
ответ дан 26 November 2019 в 23:06
поделиться

Одна из основных составляющих C (и по большей части C ++) заключается в том, что вы не платите за то, что вам не нужно.

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

Если вам нужна таблица поиска, напишите программу для ее создания. Затем используйте эти данные в своей программе.

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

0
ответ дан 26 November 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: