I'm currently experimenting with the new c++2a 'concepts' feature. The goal of my code below is to check some property of a templated struct. As the first template argument is 'reserved' for the type to be checked, I have difficulties using the concept without a requires
expression or specifying template arguments manually. This is not a big deal, but I like the concept
notation for its clarity. Is there a way to work around this?
Compiler
gcc-g++-10.0 (GCC) 10.0.1 20200119 (experimental)
Copyright (C) 2020 Free Software Foundation, Inc.
Compile command
g++-10.0 -std=c++2a file.cc
Code
#include <concepts>
/// Struct has template arguments and a property that can be checked in a concept.
template <bool a> struct A {
constexpr static bool property() noexcept { return a; }
};
template <typename T, bool a> concept hasProp = std::is_same_v<T, A<a>> && A<a>::property();
template <bool a> requires hasProp<A<a>, a> void works(A<a> c) {}
template <bool a, hasProp<a> c> void deductionError(c d) {};
// This is a sketch of what I'd like to do:
// template <A<a, b> Class, bool a, bool b> concept hasProp = Class::property;
int main() {
A<true> a;
A<false> b;
works(a);
//works(b); //doesn't compile as the constraint is not fulfilled, which is desired.
//deductionError(a); // I get why this deduction error occurs, but is it possible to do this
// in a clean way using concepts without having so specify template arguments?
}