std::is_member_function_pointer 如果为假则不编译
std::is_member_function_pointer does not compile if false
我在找什么: 我有一个模板化的 class,如果 class 有想要的函数,我想调用一个函数,比如:
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;
那么,当我不能在 if constexpr
中使用它时,std::is_member_function_pointer
有什么用?如果我只使用 this->_t->x()
,编译器肯定也会失败。
is_member_function_pointer
未检测到实体 T::x
的存在,它假定它存在并且 returns 无论它是否是成员函数指针。
如果要检测是否存在,可以使用detection idiom。示例:
#include <experimental/type_traits>
template<class T>
using has_x = decltype(&T::x);
template<class T> void do_something(T t) {
if constexpr (std::experimental::is_detected<has_x, T>::value) {
t.x();
}
}
struct Foo {
void x() { }
};
struct Bar { };
int main() {
do_something(Foo{});
do_something(Bar{});
}
我写了一篇关于检查不同 C++ 标准版本中表达式有效性的一般问题的文章:
我在找什么: 我有一个模板化的 class,如果 class 有想要的函数,我想调用一个函数,比如:
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;
那么,当我不能在 if constexpr
中使用它时,std::is_member_function_pointer
有什么用?如果我只使用 this->_t->x()
,编译器肯定也会失败。
is_member_function_pointer
未检测到实体 T::x
的存在,它假定它存在并且 returns 无论它是否是成员函数指针。
如果要检测是否存在,可以使用detection idiom。示例:
#include <experimental/type_traits>
template<class T>
using has_x = decltype(&T::x);
template<class T> void do_something(T t) {
if constexpr (std::experimental::is_detected<has_x, T>::value) {
t.x();
}
}
struct Foo {
void x() { }
};
struct Bar { };
int main() {
do_something(Foo{});
do_something(Bar{});
}
我写了一篇关于检查不同 C++ 标准版本中表达式有效性的一般问题的文章: