Я работаю над некоторыми системными вещами типа C ++, и у меня возникают проблемы с удалением константности из функции-члена для использования с классами функций. Что действительно вызывает сомнения, так это то, что с 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