Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Что нового в С++ под Visual Studio 2013

3 комментария

В прошлом посте речь шла про нововведения в F# 3.1, в этом же мы немного поговорим про то, что нового в поддержке С++ в Visual Studio 2013. Заметьте что нам обещали что обновления компилятора С++ будут out of band, но как-то этого не произошло — а может просто совпало с релизом студии. Так или иначе, вот очень прозаичный список того, что появилось:

  • Поддержка однородной инициализации объектов с использованием фигурных скобок. Вот несколько примеров:
    int meaningOfLife {42};
    int meaningOfLife2 = {42}; // можно и с =
     
    Address a(100, "London road"); // обычный конструктор
    Address a2 { 100, "London road" }; // то же самое через инициализатор
     
    vector<int> v { 0, 1, 2 }; // ну наконец-то!
    

    К вопросу о том как это делается: вот эта штука { a, b, c } называется initializer list ну или std::initializer_list если точнее. Соответственно если вы хотите инициализировать имя (+ возможно фамилию и отчество), нужно писать что-то вроде:

    class Name
    {
      string firstName, lastName;
      vector<string> otherNames;
    public:
      Name(initializer_list<string> stuff)
      { 
        // у initializer_list нет оператора []
        auto b = begin(stuff), e = end(stuff);
        firstName = *b;
        if (++b != e)
          lastName = *b;
        while (++b != e)
          otherNames.push_back(*b);
      }
    }
    

    Вот как-то так. Интересный вопрос в том как передать произвольный набор данных. В .NET мы пишем params object[], а тут с этим сложнее, хотя… читайте дальше.

  • Введен аналог make_shared для единичных инстансов (т.е. unique_ptr) под названием make_unique. Напоминаю что предпочтительно как раз использовать эти методы нежели писать например shared_ptr foo(new Bar). Но вообще это конечно читинг – тащить фичи из Буста :)
  • Строковые литералы в которых не производится замена escape sequences, т.е. raw string literals. В .NET мы используем префикс @, а тут это префикс R:

    string s = R"c:\windows"; // backslash!
    string s2 = R"Hello
    world!"; // line breaks!
    
  • В предыдущих версиях С++, дефолтные параметры шаблонных аргументов могли фигурировать только в параметрах типа. Сейчас это можно делать и в функциях.
    template <typename T, typename U = less<T>> T FindSomething(vector<T>& v, U u = U())
    
  • Кортежи! Опять же, из Буста. Определается как tuple<int,string,Foo>, использует списки инициализации (см. выше) или же специальную конструкцию make_tuple() (эти две вещи эквивалентны), достается адским (по сравнению с .NET) способом через get<2>(myTuple) что я считаю просто кошмарно хотя наверняка появилось из-за того, что в отличии от C# у нас есть вариадичность.
  • Вариадические шаблоны — ухх, фича чтобы сломать кому-нибудь мозг. Вариадические шаблоны позволяют иметь неопределенное количество шаблонных аргументов у типа. Намек: а как кортеж работает? Ведь у него может быть сколько угодно аргументов с разными типами, так?

    Вообщем, это С++11я фича языка, которая как раз дает возможность использовать такие вещи как make_shared/make_unique. Точнее вещи такие раньше просто использовали вагон перегрузок (до N=5), а теперь мы можем вздохнуть т.к. теперь можно иметь 25 параметров, если действительно нужно.

    Работает эта штука и для функций и для классов, и выглядит прозаично:

    template <typename... Ts> class Stuff {};
    templat <typename... Ts> void func(Ts... values) {}
    

    Также у нас есть оператор расширения этих «неопределенных» параметров ..., что используется например для форвардинга (т.е. return new Foo(forward<Ts>(args)...)). Этот хитрый оператор собственно просит компилятор развернуть параметры как список (например a, b, c). Соответственно, есть 2 варианта:

    • Отослать параметры кому-то, возможно в функцию которая принимает фиксированное кол-во аргументов.
    • Замутить рекурсию. Например если у вас есть T... то можно сделать функцию foo(T a, T b, T... rest) и просто рекурсивно вызывать эту функцию с (b,rest) или просто (rest), тем самым отсекая первые 1/2 элемента.

Ну вот как-то так. ■

Advertisements

Written by Dmitri

26 октября 2013 в 14:14

Опубликовано в С++

комментария 3

Subscribe to comments with RSS.

  1. Прибавилось забот для разработчиков JetBrains C++ IDE ;)

    Achmedzhanov Nail

    31 октября 2013 at 8:39

  2. Ну да. С этим инструментом можно качественно и быстро работать. Особенно поражает то что это нововведение дает возможность использовать такие вещи как make_shared/make_unique и строковые литералы.

    samsim

    19 ноября 2013 at 0:33


Оставить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: