blob: d6baa3ae84ba1460b8891cbc84dc7a192f79b62a [file] [edit]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// REQUIRES: std-at-least-c++26
// constant_wrapper
// The class template constant_wrapper aids in metaprogramming by ensuring that the
// evaluation of expressions comprised entirely of constant_wrapper are core constant
// expressions ([expr.const]), regardless of the context in which they appear. In particular,
// this enables use of constant_wrapper values that are passed as arguments to constexpr
// functions to be used in constant expressions.
#include <utility>
constexpr auto initial_phase(auto quantity_1, auto quantity_2) { return quantity_1 + quantity_2; }
constexpr auto middle_phase(auto tbd) { return tbd; }
constexpr void profit() {}
void final_phase(auto gathered, auto available) {
if constexpr (gathered == available)
profit();
}
void impeccable_underground_planning() {
auto gathered_quantity = middle_phase(initial_phase(std::cw<42>, std::cw<13>));
static_assert(gathered_quantity == 55);
auto all_available = std::cw<55>;
final_phase(gathered_quantity, all_available);
}
int main(int, char**) {
impeccable_underground_planning();
return 0;
}