Придумайте пример, в котором демонстрируется, по крайней мере, три различия между функциональными шаблонами и макросами (не считая разницы в синтаксисе их определений).
Да будем опять вспоминать, что такое шаблон, а что такое макрос. Ладно сначала мы попытаемся написать пример, а затем поговорим, а то так мне даже нечего сказать. Призабыл я за макросы.
Фот код что у меня получился файл main.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
//3 razlichi9 mejdy wablonami i makrocami #include <iostream> using std::cout; using std::endl; #define F(a) cout <<a<<endl; //#define F( Foo<int,double> ) cout <<"vuzov "<<endl;//da i owibka #define FF(a,b) cout <<(a*b)<<endl; namespace funk { template<typename T> void f(T a) { cout <<a<<endl; } template<typename T,typename R> void ff(T a, R b) { cout <<(a*b)<<endl; } } int main() { //1. различие область видимости. //f<int>(3);//ошибка: область видимости funk::f<int>(3); //макросы игрорируют область видимости. F("hellow"); //2 . шаблоны не воспринимают угловые скобки //Считает что передали два параметра Foo<int и double> //F( Foo<int,double> )//ошибка: шаблоны не воспринимают угловые скобки. //3. Да не как я не могу придумать могу токо одно сказать избегайте применение шаблонов. //а придумал, это не соблюдение приоритета операций например FF(3+4, 2); //как мы видим вывело 11 хотя должно вывести 17, как бы тупо происходит замена выражений //проверим щас шаблон funk::ff<int,int>(3+4,2); //как видим правильный результат 14 //Как не странно но я еще 4 заметил это конфликт имен //если в шаблоне мы определим функцию FF то она будет конфликтовать с //макропроцесорной функцией FF короче фигня получаеться из за глобальности макросов. //лучше их не юзать вывод. return 0; } |
Основные отличия это:
- Отсутсвие у макросов области видимости.
- Не поддержка угловых скобок макросами.
- Не правильный подсчет если передаешь выражение
- И конфликтность имен , ну это из первого пункта вылазит.
[youtube]http://www.youtube.com/watch?v=tQUzJcb2_jE[/youtube]