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

Posted

技术标签:

【中文标题】C++11:is_member_pointer 不适用于许多 STL 容器函数【英文标题】:C++11: is_member_pointer not working for many STL container functions 【发布时间】:2012-06-28 19:46:39 【问题描述】:

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

cout << is_member_pointer<decltype(&vector<int>::member)>::value;

在向量的情况下,我得到一个“模板参数无效”和一个冗长的“......类型未知”消息,用于所有迭代器函数和所有修饰函数,除了 clear。其他容器功能也有类似的故障。我有 mingw g++ 4.6.2。

有没有办法解决这个问题?

【问题讨论】:

这可能与迭代器函数重载有关:有两个begin()end() 函数,每个级别一个constness。类似地,operator[]at 等许多其他函数都是 const 重载的。另一方面,size() 不是const-overloaded。 您能否发布一个具体示例、错误代码以及您使用的编译器/版本? 【参考方案1】:

问题可能是你checked the type of overloaded methods。这是不可能的,因为像&amp;std::vector&lt;int&gt;::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

【讨论】:

你能否解决这个问题,也许,通过添加一个表明你想要哪些功能的演员表? @templatetypedef:见编辑。我认为在 decltype 中转换为正确的类型是没有意义的——你可以直接写类型。 感谢您的回答;这对我来说似乎是一个足够的解决方案。 或许不是;我想使用“is_member_pointer”和“enable_if”作为模板参数,看来我不能那样转换类型...... @AndrásKovács:为什么?也许你只需要typename。如果只需要检查.begin是否存在,可以检查decltype&lt;declval&lt;Vector&gt;().begin()&gt;

以上是关于C++11:is_member_pointer 不适用于许多 STL 容器函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++11 不支持匿名结构,而 C11 支持?

可能编译器默认不使用C++11的特性,VS设置使用C++11的特性的方法

为啥 C++11 不支持在静态成员函数上声明 extern "C"?

WebAssembly |错误:“C/ObjC”不允许使用无效参数“-std=c++11”

在 C++11 中不允许重新定义 lambda,为啥?

C++11 错误与调用主外部的 Ifstream 不匹配