Viewing file: concepts-pr67860.C (1.28 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { dg-do compile { target c++20 } } // { dg-additional-options "-fconcepts-ts" }
#include <type_traits>
inline constexpr bool and_impl() { return true; }
template <class OperandFirst, class... OperandsRest> constexpr bool and_impl(OperandFirst operand_first, OperandsRest... operands_rest) { return operand_first && and_impl(operands_rest...); }
template <class... Operands> constexpr bool and_(Operands... operands) { return and_impl(operands...); }
template <class X> concept bool C() { return true; }
// v1 template<int, class... Xs> requires and_(C<Xs>()...) constexpr int f(const Xs&... xs) { return 0; }
// v2 template<int, class... Xs> constexpr int f(const Xs&... xs) { return 1; }
int main() { static_assert(f<10>(3.0, 2.0f) == 0); return 0; }
// 2nd example
template <typename T, typename... Us> concept bool AreType() { return (std::is_same<T,Us>::value && ...); // return true; gives the same overloaded error }
// Function with constraint template<typename T, AreType<T>... Us> constexpr bool isValid(Us... us) { return true; }
// Function with no constraint template<typename T, typename... U> constexpr bool isValid(U... u) { return false; }
int main2() { static_assert(isValid<int>(1)); // also isValid<int>(1, 2, 3); etc return 0; }
|