Удаление списка параметров из f (list) с помощью препроцессора

Мне кажется, что я видел что-то странное, что делалось в библиотеке ускорения, и это оказалось именно тем, что я пытаюсь делать сейчас. Не могу его найти ...

Я хочу создать макрос, который принимает сигнатуру и превращает ее в указатель на функцию:

void f(int,int) {}

...
void (*x)(int,int) = WHAT( (f(int,int)) );

x(2,4); // calls f()

Мне это особенно нужно для работы с указателями функций-членов, чтобы WHAT принимал два параметра:

WHAT(ClassType, (f(int,int)); // results in static_cast(&ClassType::f)

Это не является абсолютно необходимым для решения моей проблемы, но это немного улучшит ситуацию.


Этот вопрос сам по себе не имеет ничего общего с указателями функций. Что нужно сделать, так это использовать препроцессор, чтобы взять "f (int, int)" и превратить его в две разные части:

'f' '(int, int)'


Почему:

Я решил проблему, поднятую здесь: Прагматическое создание классов Qt Q_OBJECT

Я начал серию статей, объясняющих, как это сделать: http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html http://crazyeddiecpp.blogspot.com/2011/01 /quest-for-sane-signals-in-qt-step-2.html

Подпись должна быть вычислена на основе "сигнала", с которым пользователь пытается подключиться, и точно соответствовать ему. Пользователи Qt привыкли выражать это как SIGNAL (fun (param, param)) , поэтому что-то вроде connect_static (SIGINFO (object, fun (param, param)), [] (int, int ) {}) не будет казаться слишком странным.

Чтобы построить подпись, мне нужно иметь возможность извлечь ее из предоставленных аргументов. Информации достаточно, чтобы получить адрес функции-члена (с использованием типа decltype C ++ 0x) и получить подпись для создания соответствующей оболочки, но я не вижу, как ее получить. Ближайшее, что я могу придумать, - это SIGINFO (object, fun, (param, param)) , что, вероятно, достаточно хорошо, но я подумал, что спрошу здесь, прежде чем посчитать невозможным получить точный синтаксис. предпочел бы.

9
задан Community 23 May 2017 в 12:31
поделиться