C ++ Macro Arithmetric - PullRequest
       21

C ++ Macro Arithmetric

4 голосов
/ 19 марта 2010

Я имею дело с макросами (это макросы, вызывающие макросы; поэтому шаблоны исключены).

Вот что я хочу:

foo(3, a, b1, c1) --> foo1(a, b1, c1);
foo(5, a, b1, c1, b2, c2) -> foo2(a, b1, c1, b2, c2);
foo(7, a, b1, c1, b2, c2, b3, c3) -> foo3(a, b1, c1, b2, c2, b3, c3);

Итак, в общем, я хочу иметь возможность выполнять «функцию» n -> (n-1) / 2 во время расширения макроса. Это возможно?

[PS, если вам не нравятся мои вопросы; Я поддерживаю ваше право понижать голос; Мой худший вопрос пока только -17, так что, возможно, мы сможем побить этот рекорд; однако, пожалуйста, дайте мне знать почему мой вопрос технически недействителен.]

EDIT:

Foo принимает переменную # аргументов в форме:

foo(N, a1, b1, a2, b2, ... a_N, b_N) -> foo##N(a1, b1, a2, b2, ... a_N, b_N);

EDIT:

Всем близким. Это совсем другой вопрос. Первый - о том, «как мне посчитать количество аргументов в макросе». (на что был хороший ответ в списке рассылки).

Этот вопрос является вопросом: учитывая, что я посчитал количество аргументов, как мне его рассылать?

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Я не проверял это, но должен работать:

#define SUBSTFOO3( a, b1, c1 ) foo1(a, b1, c1)
#define SUBSTFOO5( a, b1, c1, b2, c2 ) foo2(a, b1, c1, b2, c2)
/* ad nauseam */

#define foo( N, ... ) SUBSTFOO ## N ( __VA_ARGS__ )

Это также может работать:

#define SUBSTFOO3 foo1 /* no arguments needed */
#define SUBSTFOO5 foo2 /* "( __VA_ARGS__)" already the correct substitution */

#define foo( N, ... ) SUBSTFOO ## N ( __VA_ARGS__ )
1 голос
/ 19 марта 2010

Я не уверен, что понимаю ваш вопрос, но он напоминает мне об этом обмане, который я видел в источнике GCC. Может быть, вы найдете что-то подходящее.

#if GCC_VERSION >= 3000 || __STDC_VERSION__ >= 199901L
/* Use preprocessor trickery to map "build" to "buildN" where N is the
   expected number of arguments.  This is used for both efficiency (no
   varargs), and checking (verifying number of passed arguments).  */
#define build(code, ...) \
  _buildN1(build, _buildC1(__VA_ARGS__))(code, __VA_ARGS__)
#define _buildN1(BASE, X)   _buildN2(BASE, X)
#define _buildN2(BASE, X)   BASE##X
#define _buildC1(...)       _buildC2(__VA_ARGS__,9,8,7,6,5,4,3,2,1,0,0)
#define _buildC2(x,a1,a2,a3,a4,a5,a6,a7,a8,a9,c,...) c
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...