我目前正在写我的第一个概念。编译器是使用-fconcepts调用的g++ 7.2。我的概念如下所示:

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的成员。该成员应与概念堆栈匹配。如何向环境添加这样的要求?

最佳答案

我使用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;
}

关于c++ - 如何将概念应用于成员变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47251676/

10-10 17:00