Как применять понятия к переменным-членам

Я сейчас пишу свои первые концепции. Компилятор g ++ 7.2 вызывается с -fconcepts. Мои концепции выглядят так:

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. Этот член должен соответствовать понятию Stack. Как мне добавить такое требование к окружающей среде?

3

Решение

Я протестировал это решение с опцией gcc 6.3.0 и -fconcepts.

#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;
}
1

Другие решения

Других решений пока нет …