
Hello, Not having a good time with the PP lately, and am struggling over the following - would like to generate: void foo(T1) { bar<T1>(a[0]); } void foo(T1, T2) { bar<T1, T2>(a[0]); bar<T1, T2>(a[1]); } void foo(T1, T2, T3) { bar<T1, T2, T3>(a[0]); bar<T1, T2, T3>(a[1]); bar<T1, T2, T3>(a[2]); } ...and so on. All help most welcome. Cheers, -- Manfred

Hello, I find I am still far from a solution to this, and hope someone might kindly chime in. At the _bottom_ of this email is what I've got so far, though falls short of a solution... help is still sorely needed.
Not having a good time with the PP lately, and am struggling over the following - would like to generate:
void foo(T1) { bar<T1>(a[0]); }
void foo(T1, T2) { bar<T1, T2>(a[0]); bar<T1, T2>(a[1]); }
void foo(T1, T2, T3) { bar<T1, T2, T3>(a[0]); bar<T1, T2, T3>(a[1]); bar<T1, T2, T3>(a[2]); }
...and so on.
I have this far: #define <boost/preprocessor/iteration/local.hpp> #define <boost/preprocessor/iteration.hpp> #define <boost/preprocessor/repetition.hpp> #define <boost/preprocessor/repetition/enum.hpp> #define <boost/preprocessor/repetition/enum_params.hpp> #define <boost/preprocessor/repetition/repeat.h> #define PASTE(z, n, T) T ## n /**/ #define MACRO(z, n, T) bar<BOOST_PP_REPEAT(n, PASTE, T)> (a[n]); /**/ #define INIT(z, n, T) BOOST_PP_REPEAT(1, MACRO, T) /**/ #define OP2(z, n, T) \ \ void foo(BOOST_PP_ENUM_PARAMSi(n, T)) \ { \ BOOST_PP_REPEAT(n, INIT, T) \ } /**/ #define OPERATOR(z, n, _) OP2(z, n, T) #define BOOST_PP_LOCAL_MACRO(n) OPERATOR(_, n, _) #define BOOST_PP_LOCAL_LIMITS(1, 3) #include BOOST_PP_LOCAL_ITERATE() #undef BOOST_PP_LOCAL_MACRO #undef BOOST_PP_LOCAL_LIMITS #undef OPERATOR The above almost gives what I am after, **but fails**; resulting output is: void foo(T0) { bar< >(a[0]); } void foo(T1, T2) { bar< >(a[0]); bar< >(a[0]); } void foo(T1, T2, T3) { bar< >(a[0]); bar< >(a[0]); bar< >(a[0]); } -template parameters on 'bar' are still lacking -varying index on 'a' also lacking ..Sincerely hoping a kind soul might point out what in the above needs changing to achieve desired result. -- Manfred

2010/5/31 Manfred Doudar <manfred.doudar@rsise.anu.edu.au>
Hello,
I find I am still far from a solution to this, and hope someone might kindly chime in. At the _bottom_ of this email is what I've got so far, though falls short of a solution... help is still sorely needed.
#include <boost/preprocessor.hpp> #define VAR(z, n, k) \ bar<BOOST_PP_ENUM_PARAMS(k, T)>(a[n]); #define FUN(n) \ void foo(BOOST_PP_ENUM_PARAMS(n, T)) \ { \ BOOST_PP_REPEAT(n, VAR, n) \ } #define BOOST_PP_LOCAL_MACRO(n) FUN(n) #define BOOST_PP_LOCAL_LIMITS (1, 3) #include BOOST_PP_LOCAL_ITERATE() By the way, you don't have to undef BOOST_PP_LOCAL_MACRO and BOOST_PP_LOCAL_LIMITS. They are undef-ed in BOOST_PP_LOCAL_ITERATE. Roman Perepelitsa.

Hello Roman, Thank you ever so much, and for a lovely solution at that too; far cleaner than the direction I was heading. Can't thank you enough! --Manfred On Mon, 31 May 2010 17:19:40 +0200 Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote:
2010/5/31 Manfred Doudar <manfred.doudar@rsise.anu.edu.au>
Hello,
I find I am still far from a solution to this, and hope someone might kindly chime in. At the _bottom_ of this email is what I've got so far, though falls short of a solution... help is still sorely needed.
#include <boost/preprocessor.hpp>
#define VAR(z, n, k) \ bar<BOOST_PP_ENUM_PARAMS(k, T)>(a[n]);
#define FUN(n) \ void foo(BOOST_PP_ENUM_PARAMS(n, T)) \ { \ BOOST_PP_REPEAT(n, VAR, n) \ }
#define BOOST_PP_LOCAL_MACRO(n) FUN(n) #define BOOST_PP_LOCAL_LIMITS (1, 3) #include BOOST_PP_LOCAL_ITERATE()
By the way, you don't have to undef BOOST_PP_LOCAL_MACRO and BOOST_PP_LOCAL_LIMITS. They are undef-ed in BOOST_PP_LOCAL_ITERATE.
Roman Perepelitsa.
Thank you ever so much Roman, and for a lovely solution at that too; far cleaner than the direction I was heading.
participants (2)
-
Manfred Doudar
-
Roman Perepelitsa