C++ 11:is_member_pointer不适用于许多STL容器函数

And*_*ács 2 c++ c++11

我正在尝试使用type_traits标头中的is_member_pointer,使用以下语法,例如:

cout << is_member_pointer<decltype(&vector<int>::member)>::value;
Run Code Online (Sandbox Code Playgroud)

在向量的情况下,我得到一个"模板参数无效"和一个罗嗦的"类型...未知"消息,所有迭代器函数和除clear之外的所有修饰函数.其他容器功能也存在类似的故障.我有mingw g ++ 4.6.2.

有没有办法帮助这个?

jpa*_*cek 5

问题可能是您检查了重载方法的类型.这是不可能的,因为表达式&std::vector<int>::begin没有类型(有两个重载).只有在转换为所需类型后,它才会成为成员函数指针.演员看起来像这样:

std::cout << std::is_member_pointer<decltype((std::vector<int>::iterator(std::vector<int>::*)())&std::vector<int>::begin)>::value;
Run Code Online (Sandbox Code Playgroud)

不是很美观.

使用非重载方法,它可以工作.

std::cout << std::is_member_pointer<decltype(&std::vector<int>::reserve)>::value;
Run Code Online (Sandbox Code Playgroud)

BTW与gcc-4.7,你甚至得到一个更清晰的错误信息:

test.cpp:6:70: error: decltype cannot resolve address of overloaded function
Run Code Online (Sandbox Code Playgroud)