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()
函数,每个级别一个const
ness。类似地,operator[]
和 at
等许多其他函数都是 const
重载的。另一方面,size()
不是const
-overloaded。
您能否发布一个具体示例、错误代码以及您使用的编译器/版本?
【参考方案1】:
问题可能是你checked the type of overloaded methods。这是不可能的,因为像&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
【讨论】:
你能否解决这个问题,也许,通过添加一个表明你想要哪些功能的演员表? @templatetypedef:见编辑。我认为在decltype
中转换为正确的类型是没有意义的——你可以直接写类型。
感谢您的回答;这对我来说似乎是一个足够的解决方案。
或许不是;我想使用“is_member_pointer”和“enable_if”作为模板参数,看来我不能那样转换类型......
@AndrásKovács:为什么?也许你只需要typename
。如果只需要检查.begin
是否存在,可以检查decltype<declval<Vector>().begin()>
。以上是关于C++11:is_member_pointer 不适用于许多 STL 容器函数的主要内容,如果未能解决你的问题,请参考以下文章
可能编译器默认不使用C++11的特性,VS设置使用C++11的特性的方法
为啥 C++11 不支持在静态成员函数上声明 extern "C"?