Концепции C ++ 20, как определить существование функции с аргументами? - PullRequest
0 голосов
/ 28 мая 2020

В C ++ 20 теперь мы можем использовать концепции вместо SFINAE, чтобы выяснить, существует ли функция в шаблоне typename:

template<typename T> concept fooable = requires (T a) {
    a.foo();
};

class Foo {
public:
    // If commented out, will fail compilation.
    void foo() {}
    void bar() {}
};

template <typename T> requires fooable<T>
void foo_it(T t) {
    t.bar();
}

int main()
{
    foo_it(Foo());
}

Как это сделать с функциями, которые имеют непустые аргументы?

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

У вас могут быть дополнительные параметры в requires:

template<typename T> concept fooable = requires (T a, int i) {
    a.foo(i);
};

Демо

0 голосов
/ 28 мая 2020

Лучшим вариантом кажется declval:

template<typename T> concept fooable = requires (T a) {
    a.foo(std::declval<int>());
};

class Foo {
public:
    void foo(int x) {}
    void bar() {}
};

template <typename T> requires fooable<T>
void foo_it(T t) {
    t.bar();
}

int main()
{
    foo_it(Foo());
}
...