Я не нашел решения с точным синтаксисом, который вы ищете, но что-то вроде этого работает:
ТИРОВАТЬ: МОТИВАЦИЯ
Предположим, я определяю класс Handler как
class Handler {
public:
class Message { /*...*/ };
typedef int (*Callback)(Message *msg);
void registerCallback(int msgclass, Callback f);
};
Клиент может сделать
int f1(Handler::Message *msg)
{ /* handle message */ }
int f2(Handler::Message *msg)
{ /* handle message */ }
int main(){
Handler h;
h.registerCallback(1, f1);
h.registerCallback(2, f2);
// ....
}
Компилятор действительно проверит, чтоf1
а такжеf2
подходят в качестве параметров дляregisterCallback
однако, клиент должен определитьf1
а такжеf2
правильно. Так как я ужеtypedef
изданиеCallback
Я бы хотел, чтобы клиент мог использовать его вместо этого.
КОНЕЦ РЕДАКТИРОВАНИЯ
Я хотел бы сделать что-то вроде этого:
typedef int arithmetic(int i, int j);
arithmetic sum
{
return i+j;
}
arithmetic max
{
return (i>j)? i:j;
}
// etc.
Тем не менее, оба
arithmetic sum
arithmetic sum()
не компилировать, а также это
arithmetic sum(int i, int j)
что дает ошибку компилятора
func.cpp: 4: ошибка: «сумма» объявлена как функция, возвращающая функцию
Причина, по которой я хочу, это то, что я хочу иметьHandler
класс, который обеспечитtypedef
для функции обратного вызова он принимает,включая список параметров.