Když použiješ knihovní funkci na pole, jiný programátor s velkou pravděpodobností ví, jak to funguje. Když použiješ vlastní makro biktopovo-n-rozmerne-pole, tak nikdo neví, jak to funguje.
Jak by se to metaprogramování mělo řešit na velkém projektu?
* nechat si každého programátora napsat vlastní makro na pole --- pak jeden nepřečte kód druhého, ani si to pole nebudou schopni efektivně předat.
* seskupit programátory a nechat je navrhovat makro způsobem "a já bych tam ještě přidal proměnný počet rozměrů" ... "a já bych tam ještě přidal kompresi nepoužitých prvků" ... "a já bych tam ještě přidal efektivní přidávání prvků doprostřed" ... "a já bych tam ještě přidal bla bla bla" --- pak ti z toho vznikne neuzvěřitelný bastl.
* nebo vedoucí projektu to makro na pole navrhne a pak direktivně řekne "použije se toto makro na pole, jiná makra na pole jsou zakázána, chce-li někdo funkcionalitu, která tam není, má smůlu, musí ten svůj problém jinak řešit". Asi nejlepší řešení. Jenže místo toho rovnou můžeš říct "použije se C++ STL, vlastní implementace datových struktur jsou zakázané", vyjde to nastejno, navíc ušetříš čas návrhu a implementace a učení-se těch vlastních maker.
"Přece při programování obvykle nestuduješ, jak fungují jednotlivé funkce v knihovnách" --- knihovny nestuduji, ale studuji, jak fungují jednotlivé funkce, které napsali jiní programátoři na témže programu. To jinak ani nejde. Program (ani aplikační) nenapíšeš způsobem "uděláme specifikaci rozhraní mezi moduly, pak jednu skupinu necháme psát implementaci toho rozhraní, druhou skupinu necháme to rozhraní použít, a jedna skupina se nebude muset dívat na kód druhé". Když to rozhraní navrhneš, tak to navrhneš s velkou pravděpodobnostní blbě, že to půjde těžko implementovat nebo to bude nepoužitelné. Když se zjistí, že je to těžko implementovatelné, musí se to rozhraní změnit. Když se zjistí, že je to nepoužitelné, musí se to rozhraní taky změnit.
Ten návrh rozhraní mezi částmi programu je spíše iterativní cyklus "pokusíme se to specifikovat, pokusíme se to implementovat, opravíme specifikaci, aby se to lépe implementovalo, pokusíme se to použít, opravíme specifikaci, aby to bylo použitelné, změníme implementaci podle specifikace, pokusíme se to použít víc, zjistíme, že je tam ještě potřeba tohle, zjistíme, že tohle ve specifikaci jsme nikde nepoužili, tak to odstraníme, atd." Když tenhle cyklus dobře opakuješ, vznikne ti z toho solidní použitelné rozhraní. Když ten cyklus neděláš, tak z toho vznikne "návrh od komise".

