2010-06-29 7 views
1

Я думаю, что мой вопрос заключается в том, есть ли способ эмулировать поведение, которое мы получим от ключевого слова C++ 0x constexpr с текущим стандартом C++ (то есть, если я понимаю, что предполагается constexpr делать правильно).логическая функция повторного использования в выражении const

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

template<int X, unsigned int Y> 
struct xPowerY_const { 
    static const int value = X*xPowerY_const<X,Y-1>::value; 
}; 

template<int X> 
struct xPowerY_const<X, 1> { 
    static const int value = X; 
}; 

int xPowerY(int x, unsigned int y) { 
    return (y==1) ? x : x*xPowerY(x,y-1); 
} 

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

Спасибо.

Редактировать забыли упомянуть, я не хочу #define

Edit2 Также выше мой код неправильно, это не имеет дела с й^0, но это не влияет на вопрос.

+2

Причина, по которой функции 'constexpr' были добавлены в язык, является именно тем, чтобы сделать это возможным. –

+0

@Pavel, да, это имеет смысл - подумал, что, когда я отправлял сообщения, зачем они добавляли его, если бы это уже можно было сделать, но я думал, что попробую, на всякий случай – tjm

ответ

4

Шаблон метапрограммирования реализует логику совершенно другим (и несовместимым) способом от «нормального» кода на C++. Вы не определяете функцию, вы определяете тип. Просто бывает, что тип имеет значение, связанное с ним, которое создается из комбинации других типов.

Поскольку шаблоны определяют типы, логика программы не задействована. Логика - это просто побочный эффект компилятора, пытающегося разрешить отношения между шаблонами. Фактически нет никакого способа автоматически извлечь логику высокого уровня из шаблона «программа» в функцию.

FWIW, шаблон метапрограммирования не был даже проблеском в глазах Бьярна, когда шаблоны были впервые реализованы. На самом деле они на самом деле обнаружили в языковой жизни пользователями этого языка. Это «непреднамеренный» побочный эффект системы типов, которая только что стала очень популярной. Именно благодаря этому открытию новые функции добавляются к языку для более полной поддержки идиом, которые эволюционировали.

+0

спасибо, хороший ответ. не тот, на который я надеялся, но правильный, которого я боюсь :) – tjm

Смежные вопросы