C ++ Concepts - Могу ли я иметь ограничение, требующее наличия функции в классе? - PullRequest
3 голосов
/ 15 октября 2019

Ниже приведен простой фрагмент кода, который компилируется с использованием:

g++-9 -std=c++2a -fconcepts

Это попытка определить концепцию, которая требует наличия функции. Я ожидаю, что на выходе будет "да", но это не так ... Есть идеи, почему? Спасибо.

#include <iostream>


template <typename T>
concept bool HasFunc1 = 
    requires(T) {
        { T::func1() } -> int;
    };

struct Test
{
    int func1()
    {
        return 5;
    }
};

int main()
{
    if constexpr (HasFunc1<Test>)
        std::cout << "yes\n";
}

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

Вы проверяете наличие статической функции-члена. То, что вы хотите, это

template <typename T>
concept bool HasFunc1 = 
  requires(T t) {
      { t.func1() } -> int;
  };
2 голосов
/ 15 октября 2019

Попробуйте назвать это сами:

Test::func1();

prog.cc: In function 'int main()':
prog.cc:19:14: error: cannot call member function 'int Test::func1()' without object
   19 |  Test::func1();
      |              ^

О, верно. func1 должно быть либо static функцией-членом, либо вы должны вызывать ее в экземпляре вашей концепции:

template <typename T>
concept bool HasFunc1 = 
    requires(T t) {
        { t.func1() } -> int;
    };
...