Указатель функции, который указывает на функцию, которая принимает объект класса шаблона с указанным указателем функции в качестве аргумента шаблона. Возможный?

x__x

Я хочу сделать что-то вроде этого:

typedef long (* fp)(BaseWindow< fp > & wnd, HWND hwnd, long wparam, long lparam);

Но я получаю ошибку компиляции:

ошибка C2065: 'fp': необъявленный идентификатор

Можно ли это как-то реализовать?


person Rao    schedule 04.07.2009    source источник
comment
пожалуйста, вставьте строку, где компилятор сообщает об ошибке.   -  person Sahas    schedule 04.07.2009
comment
упс. Указатель был назван fp_t, но он не отображался в предварительном просмотре сообщения при вводе, поэтому я изменил его на просто fp, но забыл изменить сообщение об ошибке.   -  person Rao    schedule 04.07.2009


Ответы (2)


Нет, потому что тип параметра шаблона будет включать сам себя. Это привело бы к бесконечной рекурсии в типе.

Если вместо специализации шаблона класса вы принимаете его базовый класс, это вполне возможно.

struct TemplateBase {

};

typedef long (*fpType)(TemplateBase&, HWND, long, long);

template<fpType FP>
struct BaseWindow : TemplateBase {

};


long sampleFunc(TemplateBase &b, HWND hwnd, long wparam, long lparam) {
  ...
}

int main() {
    BaseWindow<sampleFunc> bw;
    sampleFunc(bw, ...);
}

Что вы хотите с этим делать?

person Johannes Schaub - litb    schedule 04.07.2009
comment
Это была дикая идея для проблемы, с которой я столкнулся. Но, возможно, есть лучшие способы. Было бы слишком долго объяснять проблему в виде комментария здесь, поэтому, возможно, я задам официальный вопрос через некоторое время. Спасибо за ответ. - person Rao; 04.07.2009
comment
Обратите внимание, что вы можете добавить виртуальные функции в базовый класс, и вызовы их из SampleFunc передадут управление производному классу, как и виртуальные функции в классах, не являющихся шаблонами. - person Johannes Schaub - litb; 04.07.2009