Предположим, у меня есть функция конфигурации, которую должен определить пользователь библиотеки, которая может быть или не быть constexpr
.
constexpr int iterations() { return 10; }
// Or maybe:
int iterations() { return std::atoi(std::getenv("ITERATIONS")); }
// I'm okay with requiring the constexpr version to be:
constexpr auto iterations() { return std::integral_constant<int, 10>{}; }
Теперь у меня есть функция, которая ведет себя по-разному в зависимости от значения iterations()
, но эта функция должна быть constexpr
, если есть iterations
, потому что я хочу, чтобы пользователь мог использовать ее в constexpr
, если они настроили библиотеку для этого:
/*constexpr*/ std::uint32_t algorithm(std::uint32_t x) {
auto const iterations = ::iterations();
// For illustration purposes
for (int i = 0; i < iterations; ++i) {
x *= x;
}
return x;
}
Что я могу сделать, чтобы algorithm
сделать функцию constexpr
, если iterations()
есть? Короче, я хочу что-то вроде constexpr(constexpr(::iterations()))
.
Обратите внимание, что условное constexpr
обычно зависит от параметра шаблона, как в функция-член условно constexpr, и в этом случае ключевое слово constexpr
может быть просто используется, но в этом случае я хочу, чтобы constexpr
был обусловлен чем-то, что является не параметром шаблона, а статически известной функцией. Пометка algorithm
как constexpr
является ошибкой компиляции:
error: call to non-'constexpr' function 'bool iterations()'