SlideShare a Scribd company logo
1 of 105
C++17
Antony Polukhin
Полухин Антон
Boost libraries maintainer (DLL, LexicalCast, Any, TypeIndex, Conversion)
+ Boost.CircularBuffer, Boost.Variant
Представитель РГ21, national body
Оглавление
Автоматическое определение шаблонных парамеров классов
std::to_chars std::from_charsи
std::*_v<T..>
std::variant<T...>
std::in_place<T> std::in_place<N>и
WG21О
cond-word (init-statement; condition)
std::size()
3 / 105
Оглавление
constexpr лямбда функции
if constexpr
“ ” std::*map std::*set,Разделяемые контейнеры и
std::string_view
std::filesystem::*
...Прочее
4 / 105
Автоматическое определение
шаблонных параметров классов
Auto deduct class templates
// C++14
std::pair<int, double> p14_0(17, 42.0);
auto p14_1 = std::pair<int, double> (17, 42.0);
6 / 105
Auto deduct class templates
// C++14
std::pair<int, double> p14_0(17, 42.0);
auto p14_1 = std::pair<int, double> (17, 42.0);
// C++17
std::pair p17_0(17, 42.0);
auto p17_1 = std::pair(17, 42.0);
7 / 105
Auto deduct class templates
std::vector<int> v;
// C++14
typedef std::vector<int>::iterator v_iter;
std::pair<v_iter, v_iter>(v.begin(), v.end());
8 / 105
Auto deduct class templates
std::vector<int> v;
// C++14
typedef std::vector<int>::iterator v_iter;
std::pair<v_iter, v_iter>(v.begin(), v.end());
// C++17
std::pair p(v.begin(), v.end());
9 / 105
Almost-auto deduct class templates
template <typename EF> struct scope_exit;
auto foo() { /* очень много кода с return foo1(); */ };
// C++14
auto guard14 = foo();
10 / 105
Almost-auto deduct class templates
template <typename EF> struct scope_exit;
auto foo() { /* очень много кода с return foo1(); */ };
// C++14
auto guard14 = foo();
// C++17
scope_exit guard17 = foo();
11 / 105
Auto deduct class templates
namespace std {
template <class T1, class T2>
struct pair {
// ...
constexpr pair(const T1& x, const T2& y);
// ...
};
}
12 / 105
Auto deduct class templates
namespace std {
template <class T1, class T2>
constexpr pair(const T1& x, const T2& y) -> pair<T1, T2>;
}
13 / 105
Auto deduct class templates
std::vector<int> v;
std::pair p(v.begin(), v.end());
14 / 105
Auto deduct class templates
std::vector<int> v;
std::pair p(v.begin(), v.end());
// auto p = std::pair(v.begin(), v.end());
15 / 105
Auto deduct class templates
std::vector<int> v;
std::pair p(v.begin(), v.end());
// auto p = std::pair(v.begin(), v.end());
// template <class T1, class T2> pair(const T1& x, const T2& y) ->
pair<T1, T2>;
16 / 105
Auto deduct class templates
std::vector<int> v;
std::pair p(v.begin(), v.end());
// auto p = std::pair(v.begin(), v.end());
// template <class T1, class T2> pair(const T1& x, const T2& y) ->
pair<T1, T2>;
// T1 == std::vector<int>::iterator
// T2 == std::vector<int>::iterator
17 / 105
Almost-auto deduct class templates
// C++14
std::array<char, ???> a2{"Hello word"};
18 / 105
Almost-auto deduct class templates
// C++17
namespace std {
// deduction guide
template <class T, size_t N> array(const T (&array)[N]) -> array<T,
N>;
}
std::array a2{"Hello word"}; // deduces the type `std::array<char,
11>`
19 / 105
std::to_chars и std::from_chars
std::to_chars и std::from_chars
#include <sstream> // :-(
template <class T>
T to_number_14(const std::string& s) {
T res{};
std::ostringstream oss(s); // :-(
oss >> res;
return res;
}
21 / 105
std::to_chars и std::from_chars
template<typename _Facet>
locale::locale(const locale& __other, _Facet* __f) {
_M_impl = new _Impl(*__other._M_impl, 1);
__try { _M_impl->_M_install_facet(&_Facet::id, __f); }
__catch(...) {
_M_impl->_M_remove_reference();
__throw_exception_again;
}
delete [] _M_impl->_M_names[0];
_M_impl->_M_names[0] = 0; // Unnamed.
} 22 / 105
std::to_chars и std::from_chars
#include <utility>
template <class T>
T to_number_17(const std::string& s) {
T res{};
std::from_chars(s.data(), s.data() + s.size(), res); // :-)
return res;
}
23 / 105
std::*_v<T...>
std::*_v<T...>
// In <type_traits>
// template<class T, class U> struct is_same;
// C++14
std::cout << std::is_same<T1, T2>::value;
25 / 105
std::*_v<T...>
// In <type_traits>
// template<class T, class U> struct is_same;
// C++14
std::cout << std::is_same<T1, T2>::value;
// C++17
std::cout << std::is_same_v<T1, T2>;
26 / 105
std::*_v<T...>
template<class T, class U>
constexpr bool is_same_v = is_same<T, U>::value;
27 / 105
std::variant<T...>
std::variant<T...>
#include <variant>
std::variant<int, std::string, double> v;
29 / 105
std::variant<T...>
#include <variant>
std::variant<int, std::string, double> v;
union {
int __a;
std::string __b;
double __c;
};
30 / 105
std::variant<T...>
#include <variant>
std::variant<int, std::string, double> v;
union {
int __a;
std::string __b;
double __c;
};
boost::variant<int, std::string, double> v;
31 / 105
std::variant<T...>
std::variant не аллоцирует память для собственных нужд
32 / 105
std::variant<T...>
#include <variant>
std::variant<int, std::string, double> v;
33 / 105
std::variant<T...>
#include <variant>
std::variant<int, std::string, double> v;
v = 10;
assert(std::get<int>(v) == 10);
assert(std::get<0>(v) == 10);
34 / 105
std::variant<T...>
#include <variant>
std::variant<int, std::string, double> v;
v = 10;
assert(std::get<int>(v) == 10);
assert(std::get<0>(v) == 10);
v = "Hello";
assert(std::get<std::string>(v) == "Hello");
assert(std::get<1>(v) == "Hello");
35 / 105
std::variant<T...>
std::variant<int, double> int_or_double{ 42.0 };
36 / 105
std::variant<T...>
std::variant<int, double> int_or_double{ 42.0 };
// std::get<std::string>(int_or_double);
37 / 105
std::variant<T...>
std::variant<int, double> int_or_double{ 42.0 };
// std::get<std::string>(int_or_double);
assert(std::get_if<int>(&int_or_double) == nullptr);
38 / 105
std::variant<T...>
std::variant<int, double> int_or_double{ 42.0 };
// std::get<std::string>(int_or_double);
assert(std::get_if<int>(&int_or_double) == nullptr);
int_or_double = 17;
assert(*std::get_if<int>(&int_or_double) == 17);
39 / 105
std::variant<T...>
constexpr std::variant<int, float> int_or_float{17};
40 / 105
std::variant<T...>
constexpr std::variant<int, float> int_or_float{17}; // noexcept
41 / 105
std::variant<T...>
constexpr std::variant<int, float> int_or_float{17}; // noexcept
42 / 105
std::variant<T...>
constexpr std::variant<int, float> int_or_float{17}; // noexcept
Deleter d{ /* ... */ };
std::variant<int, std::shared_ptr<int> > v{std::in_place<1>, nullptr,
std::move(d)};
43 / 105
std::variant<T...>
constexpr std::variant<int, float> int_or_float{17}; // noexcept
Deleter d{ /* ... */ };
std::variant<int, std::shared_ptr<int> > v{std::in_place<1>, nullptr,
std::move(d)};
44 / 105
std::in_place
std::in_place<T> and std::in_place<N>
std::variant<std::string, int> vari(in_place<0>, v.begin(), v.end());
std::optional<std::string> opti(in_place, v.begin(), v.end());
std::any anys(in_place<std::string>, v.begin(),
v.end());
46 / 105
std::in_place<T> and std::in_place<N>
struct in_place_tag {};
template <class T> in_place_tag in_place(unspecified1<T>) { return
{}; };
template <int I> in_place_tag in_place(unspecified2<I>) { return
{}; };
in_place_tag in_place(unspecified3) { return {}; };
47 / 105
std::in_place<T> and std::in_place<N>
template <class T> struct unspecified1{};
template <std::size_t I> struct unspecified2{};
struct unspecified3{};
struct in_place_tag {};
template <class T> in_place_tag in_place(unspecified1<T>) { return
{}; };
template <int I> in_place_tag in_place(unspecified2<I>) { return
{}; };
in_place_tag in_place(unspecified3) { return {}; };
48 / 105
std::in_place<T> and std::in_place<N>
template <class T>
using in_place_type_t = in_place_tag(&)(unspecified1<T>);
template <int I>
using in_place_index_t = in_place_tag(&)(unspecified2<I>);
using in_place_t = in_place_tag(&)(unspecified3);
49 / 105
WG21
51 / 105
52 / 105
Инициализация в условных
выражениях
cond-word (init-
statement; condition)
if (auto state = get_state(); is_good(state)) {
do_something(state);
} else {
std::cerr << "Bad state:" << state;
}
54 / 105
cond-word (init-
statement; condition)
if (auto state = get_state(); is_good(state)) {
switch (std::lock_guard lk(m); state) {
case ONE: /* ... */ break;
case TWO: /* ... */ break;
}
do_something(state);
} else {
std::cerr << "Bad state:" << state;
}
55 / 105
cond-word (init-
statement; condition)
if (auto state = get_state(); is_good(state)) {
switch (std::lock_guard lk(m); state) {
case ONE: /* ... */ break;
case TWO: /* ... */ break;
}
do_something(state);
} else {
std::cerr << "Bad state:" << state;
}
56 / 105
cond-word (init-
statement; condition)
if (auto state = get_state(); is_good(state)) {
switch (std::lock_guard lk(m); state) {
case ONE: /* ... */ break;
case TWO: /* ... */ break;
}
do_something(state);
} else {
std::cerr << "Bad state:" << state;
}
57 / 105
cond-word (init-
statement; condition)
if (auto state = get_state(); is_good(state)) {
switch (std::lock_guard lk(m); state) {
case ONE: /* ... */ break;
case TWO: /* ... */ break;
}
do_something(state);
} else {
std::cerr << "Bad state:" << state;
}
58 / 105
std::size
std::size
int a[] = { -5, 10, 15 };
// ...
for (size_t i = 0; i < std::size(a); ++i)
std::cout << a[i] << ',';
60 / 105
std::size
template <class T, std::size_t N>
constexpr std::size_t size(const T (&)[N]) noexcept {
return N;
}
61 / 105
Многопоточные алгоритмы
MT algorithms
std::vector<int> v;
v.reserve(100500 * 1024);
some_function_that_fills_vector(v);
// Многопоточная сортировка данных
std::sort(std::execution::par, v.begin(), v.end());
63 / 105
MT algorithms
std::vector<int> v;
v.reserve(100500 * 1024);
some_function_that_fills_vector(v);
// Многопоточная сортировка данных
std::sort(std::execution::par, v.begin(), v.end());
64 / 105
MT algorithms
std::vector<int> v;
v.reserve(100500 * 1024);
some_function_that_fills_vector(v);
// Многопоточная сортировка данных
std::sort(std::execution::par, v.begin(), v.end());
// In <execution>:
// std::execution::seq
// std::execution::par
// std::execution::par_unseq
65 / 105
MT algorithms
std::sort(std::execution::par, v.begin(), v.end(), [](auto left, auto
right) {
if (!left || !right)
throw std::logic_error("Zero values are not expected"); //
std::terminate()
return left < right;
});
66 / 105
MT algorithms
const bool not_ok = std::any_of(
std::execution::par, v.cbegin(), v.cend(), [](auto v) noexcept
{ return !v; }
);
if (not_ok)
throw std::logic_error("Zero values are not expected");
std::sort(std::execution::par, v.begin(), v.end(), [](auto left, auto
right) noexcept {
return left < right;
67 / 105
Структурное связывание
Structured binding
auto safe_info_14() {
auto d = get_device_info();
if (!d.first) // first? Что в нём хранится?
throw safe_info_exception();
return d.second; // second?
}
69 / 105
Structured binding
using device_info
= std::array<char, 1024 * 640>; // 640КБ должно быть достаточно для
каждого :)
std::pair<bool, device_info> get_device_info() noexcept;
auto safe_info_14() {
auto d = get_device_info();
if (!d.first) // first? Что в нём хранится?
throw safe_info_exception();
return d.second; // second?
70 / 105
Structured binding
auto safe_info_17() {
auto [ok, info] = get_device_info();
if (!ok)
throw safe_info_exception();
return info;
}
71 / 105
Structured binding
struct point {
point() = delete;
long double dimensions[3];
};
point& get_point_of_interest();
72 / 105
Structured binding
struct point {
point() = delete;
long double dimensions[3];
};
point& get_point_of_interest();
// ...
auto& [x, y, z] = get_point_of_interest();
x += 42.0;
y += 17.0;
z += 3.14;
73 / 105
Structured binding
std::map<int, short> m;
// ...
for (auto& [client_id, port]: m) {
port = ::open_port_for(client_id);
}
74 / 105
Constexpr lambda
Constexpr lambda
template <class... T>
constexpr bool to_bool(const std::variant<T...>& var);
76 / 105
Constexpr lambda
template <class... T>
constexpr bool to_bool(const std::variant<T...>& var) {
if (var.valueless_by_exception())
return false;
77 / 105
Constexpr lambda
template <class... T>
constexpr bool to_bool(const std::variant<T...>& var) {
if (var.valueless_by_exception())
return false;
return std::visit([](const auto& v) -> bool {
return v;
}, var);
}
78 / 105
Constexpr lambda
template <class... T>
constexpr bool to_bool(const std::variant<T...>& var) {
if (var.valueless_by_exception())
return false;
return std::visit([](const auto& v) -> bool {
return v;
}, var);
}
79 / 105
Constexpr lambda
template <class... T>
constexpr bool to_bool(const std::variant<T...>& var) {
if (var.valueless_by_exception())
return false;
return std::visit([](const auto& v) -> bool {
return v;
}, var);
}
80 / 105
if constexpr
if constexpr
template <class ...T>
auto vectorize(const T&... args) {
constexpr std::size_t vector_length = 3u;
constexpr std::size_t count = sizeof...(args);
// ...
82 / 105
if constexpr
template <class ...T>
auto vectorize(const T&... args) {
constexpr std::size_t vector_length = 3u;
constexpr std::size_t count = sizeof...(args);
if constexpr (count % vector_length != 0) {
return vectorize(args..., 0);
} else {
return compute(args...);
}
}
83 / 105
Splicing Maps and Sets
Splicing Maps and Sets
struct user {
std::string bio;
std::string address;
std::vector<unsigned char> photo;
std::array<unsigned char, 128> key;
// ...
};
85 / 105
Splicing Maps and Sets
class user_registry {
std::unordered_map<std::string, user> data_;
public:
void update(const std::string& old_name, std::string new_name);
};
86 / 105
Splicing Maps and Sets
// C++14
void user_registry::update(const std::string& old_name, std::string
new_name) {
auto it = data_.find(old_name);
if (it == data_.cend())
return;
user user_copy = std::move(it->second);
data_.erase(it);
data_.emplace(std::move(new_name), std::move(user_copy));
}
87 / 105
Splicing Maps and Sets
// C++17
void user_registry::update(const std::string& old_name, std::string
new_name) {
auto node = data_.extract(old_name);
if (!node)
return;
node.key() = std::move(new_name);
data_.insert(std::move(node));
}
88 / 105
std::string_view
std::string_view
// C++14
void foo(const std::string& value);
90 / 105
std::string_view
// C++14
void foo(const std::string& value);
void foo(const char* value);
91 / 105
std::string_view
// C++14
void foo(const std::string& value);
void foo(const char* value);
void foo(const char* value, std::size_t length);
92 / 105
std::string_view
// C++14
void foo(const std::string& value);
void foo(const char* value);
void foo(const char* value, std::size_t length);
// C++17
void foo(std::string_view value);
93 / 105
std::string_view
// C++14
template <class CharT>
void foo(const std::basic_string<CharT>& value);
template <class CharT>
void foo(const CharT* value);
template <class CharT>
void foo(const CharT* value, std::size_t length);
94 / 105
std::string_view
// C++17
template <class CharT>
void foo(std::basic_string_view<CharT> value);
95 / 105
std::filesystem
std::filesystem
#include <filesystem>
#include <iostream>
int main() {
std::filesystem::directory_iterator it("./");
std::filesystem::directory_iterator end;
for (; it != end; ++it) {
std::filesystem::file_status fs = it->status();
// ...
97 / 105
std::filesystem
std::filesystem::file_status fs = it->status();
switch (fs.type()) {
case std::filesystem::file_type::regular:
std::cout << "FILE ";
break;
case std::filesystem::file_type::symlink:
std::cout << "SYMLINK ";
break;
case std::filesystem::file_type::directory:
std::cout << "DIRECTORY ";
break;
98 / 105
std::filesystem
if (fs.permissions() & std::filesystem::owner_write) {
std::cout << "W ";
} else {
std::cout << " ";
}
std::cout << it->path() << 'n';
} /*for*/
} /*main*/
99 / 105
std::filesystem
using namespace std::filesystem;
path read_symlink(const path& p);
path read_symlink(const path& p, std::error_code& ec);
100 / 105
std::filesystem
using namespace std::filesystem;
path read_symlink(const path& p);
path read_symlink(const path& p, std::error_code& ec);
101 / 105
std::filesystem
using namespace std::filesystem;
path read_symlink(const path& p);
path read_symlink(const path& p, std::error_code& ec);
102 / 105
Прочее...
Прочее...
memory_order_consume
std::function's allocators
std::iterator/std::get_temporary_buffe
r/std::is_literal_type
template <auto V> struct …
std::any
std::optional
[*this](){ /* ... */ } 104 / 105
Спасибо! Вопросы?
105 / 105

More Related Content

What's hot

ECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascriptECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascriptmatparisot
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRAMBLER&Co
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSDarwin Durand
 
Java AWT Calculadora
Java AWT CalculadoraJava AWT Calculadora
Java AWT Calculadorajubacalo
 
Writeup ctf online idsecconf 2017
Writeup ctf online idsecconf 2017Writeup ctf online idsecconf 2017
Writeup ctf online idsecconf 2017idsecconf
 
Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Fwdays
 
珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11翀 周
 
The core of javascript
The core of javascriptThe core of javascript
The core of javascriptspringuper
 
JAVA Program in NetBeans
JAVA Program in NetBeansJAVA Program in NetBeans
JAVA Program in NetBeansHimanshiSingh71
 
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6Technopark
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Loïc Knuchel
 
Java Thread Cronometro
Java Thread CronometroJava Thread Cronometro
Java Thread Cronometrojubacalo
 
Java лаб13
Java лаб13Java лаб13
Java лаб13Enkhee99
 
Ejb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.XEjb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.Xa19987225
 

What's hot (20)

ECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascriptECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
ECMAscript 2015 aka ES6 : à la découverte du nouveau javascript
 
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 
Java AWT Calculadora
Java AWT CalculadoraJava AWT Calculadora
Java AWT Calculadora
 
Writeup ctf online idsecconf 2017
Writeup ctf online idsecconf 2017Writeup ctf online idsecconf 2017
Writeup ctf online idsecconf 2017
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"Александра Калинина "Trojan War: SinonJS"
Александра Калинина "Trojan War: SinonJS"
 
珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11珠三角技术沙龙新语言场 C++11
珠三角技术沙龙新语言场 C++11
 
Image Fundamental
Image FundamentalImage Fundamental
Image Fundamental
 
The core of javascript
The core of javascriptThe core of javascript
The core of javascript
 
week-24x
week-24xweek-24x
week-24x
 
JAVA Program in NetBeans
JAVA Program in NetBeansJAVA Program in NetBeans
JAVA Program in NetBeans
 
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
 
Danna y felix 10°
Danna y felix 10°Danna y felix 10°
Danna y felix 10°
 
Java Thread Cronometro
Java Thread CronometroJava Thread Cronometro
Java Thread Cronometro
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Gjuha paskal
Gjuha paskal Gjuha paskal
Gjuha paskal
 
Ejb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.XEjb 3.0 Glassfish 2.X Netbeans 6.X
Ejb 3.0 Glassfish 2.X Netbeans 6.X
 

Viewers also liked

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itSergey Platonov
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеIlia Shishkov
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit TestingDmitry Vyukov
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейSergey Platonov
 
Регулярные выражения C++
Регулярные выражения C++Регулярные выражения C++
Регулярные выражения C++Dmitry Bulgakov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Platonov Sergey
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxPlatonov Sergey
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 

Viewers also liked (20)

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 
Регулярные выражения C++
Регулярные выражения C++Регулярные выражения C++
Регулярные выражения C++
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 

More from Sergey Platonov

Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаSergey Platonov
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Sergey Platonov
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioSergey Platonov
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtSergey Platonov
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereSergey Platonov
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеSergey Platonov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Sergey Platonov
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Sergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Sergey Platonov
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLSergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляSergey Platonov
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Sergey Platonov
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортSergey Platonov
 

More from Sergey Platonov (20)

Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.io
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI веке
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуля
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репорт
 

Антон Полухин. C++17