#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: Да, это было так!