Я пишу несколько функций, которые принимают в качестве входных данных результат функции шаблона:
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>()
,
Обтекание ввода скобками поможет, но почему такое поведение?
Так как ,
принимается препроцессором в качестве разделителя для нового макро-аргумента, и потому что препроцессору на самом деле все равно, что вы могли бы вместо этого подразумевать его в качестве разделителя для списка параметров шаблона.
Чтобы быть немного более точным:
ALG( mat.topRightCorner<3,1>() )
^^^^^^^^^^^^^^^^^^^^ ^^^^
Оба из них лексически выглядят как допустимые аргументы макросов, и разбор макросов имеет приоритет.
С другой стороны, препроцессор знает, что ()
делает, таким образом, вы можете «форсировать» синтаксический анализ как единственный аргумент.
Других решений пока нет …