我正在尝试使用 type_traits 标头中的 is_member_pointer ,具有以下语法,例如:
cout << is_member_pointer<decltype(&vector<int>::member)>::value;
在向量的情况下,我得到一个“模板参数无效”和一个冗长的“......类型未知”消息,用于所有迭代器函数和除 clear 之外的所有修饰符函数。其他容器功能也有类似的故障。我有 mingw g++ 4.6.2。
有没有办法帮助这个?
问题可能是您检查了重载方法的类型。这是不可能的,因为像这样的表达式&std::vector<int>::begin
没有类型(有两个重载)。只有在转换为所需类型之后,它才会成为成员函数指针。演员表看起来像这样:
std::cout << std::is_member_pointer<decltype((std::vector<int>::iterator(std::vector<int>::*)())&std::vector<int>::begin)>::value;
不是很美观。
使用非重载方法,它可以工作。
std::cout << std::is_member_pointer<decltype(&std::vector<int>::reserve)>::value;
顺便说一句,使用 gcc-4.7,您甚至会收到更清晰的错误消息:
test.cpp:6:70: error: decltype cannot resolve address of overloaded function