расширение макроса с помощью шаблонов

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

int alg1(Vect3) {...}
...
int algN(Vect3) {...}

void main() {
alg1( mat.topRightCorner<3,1>() )
}

где, если вам интересно, topRightCorner возвращает подматрицу mat, метод из собственный, где измерение помещается в качестве параметров шаблона, когда они известны во время компиляции.

Однако создание «ярлыка» с использованием макроса для быстрого переключения между различными алгоритмами (поскольку в реальном коде функция вызывается много раз), например, так:

#define ALG(X)    ( algN(X) )

ALG( mat.topRightCorner<3,1>() )

выдает ошибку, так как макрос правильно раскрыт, но как-то неверно истолкован как с двумя разными параметрами, mat.topRightCorner<3 а также 1>(),

Обтекание ввода скобками поможет, но почему такое поведение?

4

Решение

Так как , принимается препроцессором в качестве разделителя для нового макро-аргумента, и потому что препроцессору на самом деле все равно, что вы могли бы вместо этого подразумевать его в качестве разделителя для списка параметров шаблона.

Чтобы быть немного более точным:

ALG( mat.topRightCorner<3,1>() )
^^^^^^^^^^^^^^^^^^^^ ^^^^

Оба из них лексически выглядят как допустимые аргументы макросов, и разбор макросов имеет приоритет.

С другой стороны, препроцессор знает, что () делает, таким образом, вы можете «форсировать» синтаксический анализ как единственный аргумент.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector