Что я ищу: У меня есть шаблонный класс, и я хочу вызвать функцию, если у класса есть требуемая функция, что-то вроде:
template<class T> do_something() {
if constexpr (std::is_member_function_pointer<decltype(&T::x)>::value) {
this->_t->x(); // _t is type of T*
}
}
Что происходит: Компилятор не компилируется, если T
не возвращает функцию. Маленький пример:
#include <type_traits>
#include <iostream>
class Foo {
public:
void x() { }
};
class Bar { };
int main() {
std::cout << "Foo = " << std::is_member_function_pointer<decltype(&Foo::x)>::value << std::endl;
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
return 0;
}
Компилятор говорит:
is_member_function_pointer.cpp:17:69: error: no member named 'x' in 'Bar'; did you mean 'Foo::x'?
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
Итак, для чего нужен std::is_member_function_pointer
, когда я не могу использовать его в if constexpr
? Если я просто использую this->_t->x()
, то компилятор тоже не сможет.