Martin Fehrs
Martin Fehrs

Reputation: 1091

How to apply concepts to member variables

I'm currently writing my first concepts. Compiler is g++ 7.2 invoked with -fconcepts. My concepts look like this:

template <typename stack_t>
concept bool Stack() {
    return requires(stack_t p_stack, size_t p_i) {
        { p_stack[p_i] };
    };
};

template <typename environment_t>
concept bool Environment() {
    return requires(environment_t p_env) {
        { p_env.stack }
    };
};

As you can see Environment should have a member named stack. This member should match the concept Stack. How do I add such a requirement to Environment?

Upvotes: 3

Views: 1040

Answers (1)

p-a-o-l-o
p-a-o-l-o

Reputation: 10047

I tested this solution with gcc 6.3.0 and -fconcepts option.

#include <iostream>
#include <vector>

template <typename stack_t>
concept bool Stack() {
    return requires(stack_t p_stack, size_t p_i) {
        { p_stack[p_i] };
    };
};

template <typename environment_t>
concept bool Environment() {
    return requires(environment_t p_env) {
        { p_env.stack } -> Stack; //here
    };
};

struct GoodType
{
  std::vector<int> stack;
};

struct BadType
{
  int stack;
};

template<Environment E>
void test(E){}

int main()
{
  GoodType a;
  test(a); //compiles fine

  BadType b;
  test(b); //comment this line, otherwise build fails due to constraints not satisfied

  return 0;
}

Upvotes: 1

Related Questions