Являются ли шаблоны С++ скрытыми только макросами?
Я читал вышеприведенную тему, и вдруг эта мысль пришла мне в голову: почему бы не попробовать написать несколько сложных макросов, которые можно использовать в нашем реальном коде (не только в виде головоломок, которые бесполезны в реальной жизни)?
Итак, первое, на что приходило в голову, это: заполнение значений массива макросами:
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;
}
Вывод:
count = 100
1
2
3
4
.
.
.
100
Демо-версия онлайн: http://www.ideone.com/nUYrq
Можем ли мы дополнительно улучшить это решение с точки зрения компактности или общности (возможно, и того и другого)? Можем ли мы избавиться от переменной i
, которая нам нужна в макросе? Или любое другое улучшение?
Я также хотел бы знать, является ли это допустимым кодом как на С++, так и на C (конечно, игнорируя часть печати)?
EDIT:
Я понял, что порядок вызовов f()
кажется еще неопределенным. Я не уверен, хотя, как я думаю, запятая в инициализации массива не является, вероятно, такой же, как оператор запятой (в общем). Но если это так, можем ли мы избежать этого, и какая часть Стандарта говорит о его неуточнении?