X<int>::add
является нестатической функцией-членом.Это означает, что &X<int>::add
имеет тип int(X<int>::*)(int)
: указатель на нестатическую функцию-член X<int>
, принимающий единственный параметр int
и возвращающий int
.Такой указатель не может быть преобразован в int(*)(int)
.
int(X<int>::*)(int)
концептуально больше похож на int(*)(X<int>*, int)
, чем на int(*)(int)
(хотя реализация может фактически сильно отличаться в зависимости от соглашения о вызовах платформыили если наследование задействовано ).Для этого требуется дополнительный скрытый параметр X<int>*
: указатель this
.
Самый простой способ сделать то, что вы хотите, - использовать метод-обертку:
template<typename T>
class X {
public:
using valproc = T(X::*)(T v);
X(T v)
: val{v},
proc{&X::add}
{}
T add(T v) { return v + val; }
T curproc(T v) { return (this->*proc)(v); }
T val;
valproc proc;
};
Демонстрационная версия
Причудливый синтаксис (this->*proc)(i)
гласит: «вызвать функцию-член, указанную proc
, для объекта, на который указывает this
, с параметром i
".