Можно ли заставить функцию вести себя по-разному для постоянного аргумента или переменного аргумента?

Например, factorial (n), если аргумент является константой (выражением), то результат является детерминированным и может быть сделан во время компиляции (с помощью шаблонного метапрограммирования).

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

3

Решение

Это именно то, что constexpr функции существуют для. constexpr функции были введены в C ++ 11. При вызове с постоянными выражениями, которые могут быть оценены во время компиляции, они, как правило, оцениваются во время компиляции (и иногда вы можете заставить это произойти). Однако, как правило, невозможно предоставить гарантию. В противном случае они оцениваются во время выполнения (и вы можете вызывать их как обычные функции с постоянными или непостоянными аргументами, вычисленными во время выполнения).

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

Поскольку вы упоминаете пример factorial() функция, вот как это будет выглядеть с constexpr функция:

#include <iostream>

using namespace std;

constexpr int factorial(int n)
{
return (n == 0) ? 1 : factorial(n - 1);
}

int foo()
{
int result = 1;
// do some processing...
return result;
}

int main()
{
int v[factorial(5)]; // Evaluated at compile-time
cout << factorial(foo()); // Evaluated at run-time
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]