Современный C++ и его будущее

ЛКШ 2017.Август

Современный C++ и его будущее

ЛКШ 2017.Август

C++14

Двоичные литералы

C++14
gcc 4.9
clang 2.9
int x = 0b10010;  // 18

Разбиение чисел на разряды

C++14
gcc 4.9
clang 3.4
const int EARTH_RADIUS = 40'000'000;

auto как возвращаемый тип

C++14
gcc 4.9
clang 3.4
struct Date {
  int year, month, day;

  auto key() const {  // tuple<const int&, ...>
    return tie(year, month, day);
  }  
  bool operator<(const Date& other) const {
    return key() < other.key();
  }
};

Множество, упорядоченное по убыванию

C++14
gcc 4.9
clang 3.4
#include <functional>
        
set<int, greater<>> numbers;
        

Строковые литералы

C++14
gcc 4.9
clang 3.4
#include <string>
        
cout << min("abc"s, "def"s) << endl;
        

Ещё про auto

vector<int> numbers = {1, 2, 3};
        
auto x = numbers[1];

Ещё про auto

vector<int> numbers = {1, 2, 3};
        
auto x = numbers[1];

decltype(auto)

C++14
gcc 4.9
clang 3.3
vector<int> numbers = {1, 2, 3};
        
decltype(auto) x = numbers[1];

auto в лямбдах

C++14
gcc 4.9
clang 3.4
auto avg = [](auto x, auto y) {
  return (x + y) / 2;
};
cout << avg(5, 12) << " " <<
    avg(5., 12.) << endl;

C++17

Structured bindings

C++17
gcc 7
clang 4
map<string, int> numbers = /* ... */;
for (const auto& [key, value] : numbers) {
    cout << key << " " << value << endl;
}

auto [it, inserted] =
    numbers.emplace("seventh", 7);

Вывод шаблонных параметров класса

C++17
gcc 7
clang X
tuple t(5, "abc", false);
        
vector v = {1, 6, 3};

if с инициализацией

C++17
gcc 7
clang 3.9
map<string, int> numbers;
        
if (auto it = numbers.find("one");
    it != numbers.end()) {
  cout << it->second;
}

string_view

C++17
gcc 7
clang 4
#include <string_view>
        
string_view FindFirstWord(string_view s) {
  return s.substr(0, s.find(' '));
}

optional

C++17
gcc 7
clang 4
#include <optional>
optional<string> MakeDigitName(uint8_t x) {
  if (x == 0) {
    return "zero";
  } else if (x == 1) {
    return "one";
  } else {
    return {};
  }
}

Класс optional

C++17
gcc 7
clang 4
#include <optional>
        
if (auto name = MakeDigitName(0)) {
  cout << *name << endl;
} else {
  cout << "Unknown digit" << endl;
}

Класс any

C++17
gcc 7
clang 4
#include <any>
        
any x = "abc"s;
cout << any_cast<string>(x) << endl;
x = 8;
cout << any_cast<int>(x) << endl;

Класс variant

C++17
gcc 7
clang 4
#include <variant>
        
enum class Error { Negative, TooBig };

variant<string, Error> MakeDigitName(int x) {
  if (x == 0)     { return "zero"; }
  else if (x < 0) { return Error::Negative; }
  else            { return Error::TooBig; }
}

Класс variant

C++17
gcc 7
clang 4
if (auto res = MakeDigitName(12);
    holds_alternative<string>(res)) {
  cout << get<string>(res) << endl;
} else {
  cout <<
      static_cast<int>(get<Error>(res)) << endl;
}

Алгоритм clamp

C++17
gcc 7
clang 3.9
#include <algorithm>
        
int n;
cin >> n;
cout << clamp(n, 0, 100) << endl;

hypot от 3 аргументов

C++17
gcc 7
clang 3.9
cout << hypot(2, 3, 6) << endl;  // 7

НОД и НОК

C++17
gcc 7
clang 3.9
#include <numeric>
        
cout << gcd(6, 8) << endl;  // 2
cout << lcm(6, 8) << endl;  // 24

Folding expressions

C++17
gcc 6
clang 3.6
template <typename... Args>
auto Hypot(Args... args) {
  return sqrt(((args * args) + ...));
}

C++2a и будущие стандарты

Концепты

C++2a
gcc 6
clang X
template <typename T>
concept bool Summable =
requires(T x, T y) {
	{x + y} -> T;
};

auto sum(Summable a, Summable b) {
	return a + b;
}

Концепты

C++2a
gcc 6
clang X
template <typename T>
concept bool Summable =
requires(T x, T y) {
	{x + y} -> T;
};

Summable{T}
T sum(T a, T b) { return a + b; }

Ranges

C++2a
gcc X
clang X
vector<numbers> v = {1, 2, 3};
reverse(v);

vector<string> words = {"first", "second"};
// Сортировка по последней букве
sort(words, less<>,
     [](const string& s) { return s.back(); })

Ranges

C++2a
gcc X
clang X
vector<numbers> v = {1, 2, 3};
auto [min_it, max_it] = minmax_element(v);
cout << *min_it << " " << *max_it << endl;

auto res = minmax_element(v);
cout << *res.min() << " " <<
    *res.max() << endl;

Числа

C++??
gcc X
clang X

Я ленточка!