Проверьте наличие метода с классом

#c

Вопрос:

Я пытаюсь создать характеристику типа, чтобы выполнить проверку времени компиляции на наличие метода с типом класса. Ниже приведено то, что я реализовал. Я не совсем понимаю, почему это не работает.

T = Тип для проверки метода.

R = Тип возвращаемого метода.

P = Тип парама метода.

 template<typename T, typename R, typename P>
struct HasBarImpl {
    template<typename> static std::false_type Test(...);

    template<typename U>
    static auto Test(P* p) ->
        std::enable_if_t<std::is_same_v<decltype(declval(U).Bar(p)), R>, std::true_type>;

    static constexpr bool value = std::is_same<decltype(Test<T>(nullptr)), std::true_type>::value;
};

template<typename T, typename R, typename P>
constexpr bool HasBar = HasBarImpl<T, R, P>::value;


struct Foo {
    void Bar(int*) {}
};


TEST_CASE("Check for method's existence") {
    bool r = false;
    if constexpr (HasBar<Foo, void, int>) {
        r = true;
    }

    CHECK(r == true); // Fails
}
 

Комментарии:

1. Не ошибаетесь ли вы в порядке аргументов в своем тесте?

2. @StoryTeller-UnslanderMonica: Верно; исправлена публикация. Хотя проблема была не в этом. Публикация была ошибкой копирования и вставки. Проблема сохраняется.

3. Я считаю , что это для злоупотребления std::declval , вы должны использовать его как std::declval<U>() , а не std::declval(U) как .

4. @SHP: Да, это было так!