Are C++ Templates just Macros in disguise?
I was reading the above topic, and suddenly this idea came to my mind: why not try writing some tricky macros which can be used in our real code, (not just only as puzzles which are useless in real life)?
So the first thing came to mind is : filling array values with macros:
int f(int &i) { return ++i; }
#define e100 r5(m20)
#define m20 m5,m5,m5,m5
#define m5 r5(e1)
#define e1 f(i) //avoiding ++i right here, to avoid UB!
#define r5(e) e,e,e,e,e
int main() {
int i=0; //this is used in the macro e1
int a[] = {e100}; //filling array values with macros!
int n = sizeof(a)/sizeof(int);
cout << "count = " << n << endl;
for(int i = 0 ; i < n ; i++ )
cout << a[i] << endl;
return 0;
}
Output:
count = 100
1
2
3
4
.
.
.
100
Online demo : http://www.ideone.com/nUYrq
Can we further improve this solution in terms of compactness or genericity (possibly both)? Can we get rid of the variable i
which we need in the macro? Or any other improvement?
I would also like to know if that is valid code both in C++ and C (of course ignoring printing part)?
EDIT:
I realized that the order of calls to f()
seems still unspecified. I'm not sure though, as I think comma in array initialization is not probably same as comma operator (in general). But if it is, can we avoid it and what part of the Standard says its unspecified?