// Part of the Carbon Language project, under the Apache License v2.0 with LLVM // Exceptions. See /LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #ifndef CARBON_COMMON_METAPROGRAMMING_H_ #define CARBON_COMMON_METAPROGRAMMING_H_ #include namespace Carbon { // C++17-compatible emulation of a C++20 `requires` expression, which queries // whether a given expression is well-formed. The syntax is best explained // in terms of an example: // // template // static constexpr bool IsStreamableToRawOstream = // Requires( // [](auto&& t, auto&& out) -> decltype(out << t) {}); // // The expression enclosed in `decltype` is the expression whose validity the // trait queries. The lambda parameters declare the names that are used in // that expression, and the types of those names are specified by the // corresponding template arguments of the `Requires` call. The lambda // parameters should always have type `auto&&`, and the template arguments // should not have `&` or `&&` qualifiers. template constexpr auto Requires(F /* f */) -> bool { return std::is_invocable_v; } } // namespace Carbon #endif // CARBON_COMMON_METAPROGRAMMING_H_