【发布时间】:2011-03-25 15:25:29
【问题描述】:
我正在研究一些 C++ 类型系统的东西,但在从成员函数中删除 const-ness 以与函数特征类一起使用时遇到问题。这里真正令人困扰的是,这在 G++ 上运行良好,但 MSVC10 无法正确处理部分特化,而且我不知道这些编译器中的一个是否真的存在错误。
这里的问题是,什么是从成员函数中删除 const 限定符的正确方法,以便我可以获得函数类型签名?
获取以下代码示例:
#include <iostream>
template<typename T> struct RemovePointer { typedef T Type; };
template<typename T> struct RemovePointer<T*> { typedef T Type; };
template<typename R,typename T> struct RemovePointer<R (T::*)> { typedef R Type; };
class A {
public:
static int StaticMember() { return 0; }
int Member() { return 0; }
int ConstMember() const { return 0; }
};
template<typename T> void PrintType(T arg) {
std::cout << typeid(typename RemovePointer<T>::Type).name() << std::endl;
}
int main()
{
PrintType(&A::StaticMember);
PrintType(&A::Member);
PrintType(&A::ConstMember); // WTF?
}
所有这三个 PrintType 语句都应该打印相同的内容。 MSVC10 打印以下内容:
int __cdecl(void)
int __cdecl(void)
int (__cdecl A::*)(void)const __ptr64
g++ 打印出这个(这是预期的结果):
FivE
FivE
FivE
【问题讨论】:
-
“从成员函数中删除 const 限定符的正确方法是什么,以便我可以获得函数类型签名?”成员函数是其签名的一部分。
-
我不知道你想要这个做什么,但是静态和非静态成员函数的签名是不同的。我发现前两行的输出比第三行不同的事实更糟糕。你真正想解决的问题是什么?
-
typeid 中的 name() 完全是特定于实现的。你怎么能说哪个是对的或错的?
-
@BoPersson 你没抓住重点。
-
GCC 打印的类型是错误的(基于
c++filt完成的拆解)。第三个应该是int() const,但它说是int()。
标签: c++ templates visual-c++ g++ metaprogramming