Вы можете зафиксировать тип в функции шаблона:
#include <iostream>
struct foo {
foo() { std::cout << "OK\n"; }
int bar() {return 0;}
};
template<typename C, typename R>
bool thing(R (C::*)()) {
C x;
}
int main() {
thing(&foo::bar);
}
печатает "OK", чтобы вы могли поставить там чек is_same
.Я действительно не уверен, что вопрос, хотя - очевидно, что здесь мы используем тип функции-члена для вывода аргумента шаблона.
Если вы как-то неверно reinterpret_cast
указатель на функцию-член на что-то другое, чтобы отбросить его тип, тогда вы не сможете его восстановить.
Если вы преобразовали указатель на функцию-член в совместимый тип указателя на функцию-член, например R (B::*)()
-> R (D::*)()
, где B - базовый класс D, тогда я думаю, что вы можете использовать dynamic_cast
, чтобы проверить, действительно ли это функция B в конце концов.Вы не можете восстановить тип таким способом, просто typeid
указателя на функцию-член, потому что это операция во время выполнения.Типы действительно существуют только во время компиляции в C ++, поэтому нет способа «получить» динамический тип значения, независимо от того, является ли это значение указателем на функцию-член или чем-то еще.Компилятор либо знает это, либо нет, и если это так, то существуют различные хитрости шаблона для фактического использования составляющих этого типа.