3 различия между функциональными шаблонами и макросами.

Рубрика: C++, Дата: 11 April, 2013, Автор:

Придумайте пример, в котором демонстрируется, по крайней мере, три различия между функциональными шаблонами и макросами (не считая разницы в синтаксисе их определений).

Да будем опять вспоминать, что такое шаблон, а что такое макрос. Ладно сначала мы попытаемся написать пример, а затем поговорим, а то так мне даже нечего сказать. Призабыл я за макросы.

Фот код что у меня получился файл main.cpp:

//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;
}

Основные отличия это:

  1. Отсутсвие у макросов области видимости.
  2. Не поддержка угловых скобок макросами.
  3. Не правильный подсчет если передаешь выражение
  4. И конфликтность имен , ну это из первого пункта вылазит.

[youtube]http://www.youtube.com/watch?v=tQUzJcb2_jE[/youtube]

rss