Шаблон метапрограммирования для двойного умножения

Я пытаюсь создать метод, который дает целочисленный ввод, делает некоторые вычисления (просто умножение и деление), возвращая результат в виде double, Этот метод должен делать вычисления во время компиляции.

Я пробовал разные подходы, как это:

template <int n> struct Try
{
    static const double result = 1.0 / (double)n * Try<1>::result;
};

template <> struct Try<1>
{
    static const double  result = 1.0;
};

Но все равно безуспешно, я всегда получаю ошибки времени компиляции.

Изменить: я не использую C++11

3 ответа

Кредит идет на @ForEveR, я только исправил небольшую ошибку в своем ответе. Обратите внимание, что ничто не гарантирует, что вычисление действительно произойдет во время компиляции. Ничто действительно не гарантирует, что есть время компиляции. Бесстыдно скопированный ответ ниже.

Вы не можете инициализировать переменные нецелого типа в классе с const, вы можете сделать это только с constexpr, Поскольку вы не можете использовать C++11, вы можете попробовать это

template <int n> struct Try;

template <> struct Try<1>
{
static const double  result;
};

template <> const double Try<1>::result = 1.0;

template<int n> struct Try
{
static const double result;
};

template<int n>
const double Try<n>::result = 1.0 / (double)n * Try<1>::result;

Ваш вопрос не очень понятен, но мне кажется, что вы хотите вычислить дробную часть во двойное число. Это можно сделать с помощью очень простой функции шаблона. В этом рабочем примере создаются дубликаты в разделе.rodata (протестировано с gcc 4.8.2 и clang 3.4):

#include <iostream>

template<int N, int M> inline const double& Frac() {
  static const double result = (double)N/M;
  return result;
}

int main() {
  std::cout << Frac<3, 4>() << std::endl;     // prints "0.75"
}

Чтобы сделать то, что вы хотите, вы можете использовать другую константу, чтобы помочь вам рассчитать результат

Вот функциональный пример.

#include <iostream>

template <int n> struct Try;

template<int n> struct Try
{
static const double result;
static const double _tmp;
};

template<int n>
const double Try<n>::_tmp = n*2; // another usefull operation because it's useless here
template<int n>
const double Try<n>::result = 1.0 / ((double)n * Try<n>::_tmp);


int main() {
        std::cout << Try<5>::result << std::endl;
}
Другие вопросы по тегам