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

Если у вас есть уникальная статья и вы хотите, чтобы она стала достоянием общественности, вы можете разместить ее на Quizful.

Лента обновлений
ссылка Jan 20 15:42
Комментарий от PandaPahom:
тест в целом не плохой но лучше бы разделить по сфера...
ссылка Jan 20 15:19
Комментарий от PandaPahom:
Классно что он краткий и достаточно информативный, с ...
ссылка Jan 20 09:01
Комментарий от voges48542:
это называется "замыкание"
ссылка Jan 19 06:38
Комментарий от inkarnadin:
В том случае, если "в любом месте, где допустимо испо...
ссылка Jan 17 21:22
Комментарий от vmermolenko:
огонь
Статистика

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

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