Топ контрибуторов
loading
loading
Знаете ли Вы, что

Лучшие IT работодатели регулярно просматривают рейтинги и профили пользователей в поисках кандидатов. Для корректного отображения ваших данных рекомендуем заполнить ваш профиль и добавить информацию о вас и вашей профессии.

Лента обновлений
ссылка Oct 22 23:24
Комментарий от alexcei88:
В вопросе переменная s даже не выводиться, а выводитьс...
ссылка Oct 22 17:46
Комментарий от AlexFurm:
Это UB, так можно вызывать только статические функции ч...
ссылка Oct 22 17:43
Комментарий от AlexFurm:
Любые битовые операции с signed это UB
ссылка Oct 21 20:30
Комментарий от yoori:
Любой вариант скомпилируется если компилировать не в конеч...
ссылка Oct 21 16:53
Добавлен вопрос в тест QA (Quality Assurance)
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 443368 / 2177510.

auto и decltype в C++0x

head tail Статья
категория
C++
дата27.08.2010
авторLavroff
голосов13

Сегодня хотелось бы поговорить о двух ключевых словах из 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 на бытовом уровне)

Спасибо за внимание.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 13  loading...
toxx   k06a   art   martynov   AlanTi   i8086   ashchur   Farrel   ITcrusader   denxxjkee   lupus   USAbound   Staller