Сегодня хотелось бы поговорить о двух ключевых словах из C++0x, а именно auto и decltype. Начнем пожалуй с auto.
auto: В С++0x переопределили это ключевое слово, если ранее оно указывало на то, что переменная локальная и добавлялась к переменной(если у нее не было явно указано модификатора) по умолчанию(допустимо было и явное использование, вместе с типом), то теперь такое объявление переменной вызовет ошибку компиляции:
auto int a=5;
Итак. auto позволяет определять тип переменной по значению. Что и демонстрирует следующий код:
#include <iostream>
#include <typeinfo>
int main()
{
auto p=3.1415;
std::cout<<typeid(p).name()<<' '<<p<<'\n';
return 0;
}
Правда гораздо более полезное использование auto является запись длинных типов таких как к примеру:
std::vector<std::vector<std::pair<std::vector<int>, std::vector<int> > > > Vec;
std::vector<std::vector<std::pair<std::vector<int> std::vector<int> > > >::iterator It=Vec.begin();
Слишком длинными получаются объявления. Можно конечно похимичить с typedef, как и делают сейчас в основном:
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
typedef std::vector<std::vector<std::pair<std::vector<int>
std::vector<int> > > > VVPVV;
VVPVV Vec;
VVPVV::iterator It=Vec.begin();
return 0;
}
Но можно сделать через auto что смотрится несколько элегантнее, нежели использование typedef:
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
std::vector<std::vector<std::pair<std::vector<int>, std::vector<int> > > > Vec;
auto It=Vec.begin();
std::cout<<typeid(It).name()<<'\n';
return 0;
}
Получается лучше не правда-ли? И последний пример по auto - пример небольшой программы на С++0x.
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> Vec;
for(int i=1;i<10;++i)
Vec.push_back(i);
for(auto It=Vec.begin(); It!=Vec.end(); ++It)
std::cout<<*It<<' ';
std::cout<<std::endl;
auto It=std::find(Vec.begin(), Vec.end(), 5);
std::cout<<*It<<'\n';
return 0;
}
Переходим к decltype.
decltype:
В С++0x используется для определения типа во время компиляции без инициализации переменной, а так же используется для определения типа возвращаемого функцией значения (полезно в шаблонах):
Первый пример будет определение типа в главной функции, в зависимости от того какой тип возвращает функция.
#include <iostream>
#include <typeinfo>
double sum(int a, double b)
{
return a+b;
}
int main()
{
auto a=5;
auto b=5.5;
decltype(sum(a,b))Sum=sum(a,b);
std::cout<<typeid(Sum).name()<<' '<<Sum<<'\n';
return 0;
}
Следующий пример использования decltype - определение возвращаемого значения функции:
#include <iostream>
template <class T1, class T2>
auto sum(T1 a, T2 b) -> decltype(a+b)
{
return a+b;
}
int main()
{
auto a = 5;
auto b = 3.43;
std::cout<<sum(a,b);
return 0;
}
В итоге тип возвращаемого значения функции определяется в зависимости от типа выражения a+b.
На этом я заканчиваю эту статью, в ближайшем будущем возможно дальнейшее рассмотрение C++0x на бытовом уровне)
Спасибо за внимание.