c++ concepts make c++ template programming funny, and make c++ template programming serious.
Declaring a c++ concept is to use the keyword concept, and with template declaraton.
template <typename type_target, typename type1, typename type2> concept my_concept = an_expression_that_can_be_judged_true_or_false;
The first type type_target is the main type that will be constrained. The rest types (type1, type2, ...) are used to help to constrain the main type.
c++ example:
#include <iostream>
template <typename type_target>
namespace space
{
concept has_type = requires ()
{
typename type_target::type;
};
class m_class
{
public:
using type = int;
};
class n_class
{
public:
using type_t = float;
};
}
int main()
{
std::cout << "c++, Hi!" << std::endl;
space::has_type auto x = space::m_class{}; // OK: space::m_class has type.
space::has_type auto y = space::n_class{}; // ERROR: space::n_class does not have type, it has type_t.
}