
template <typename T>
using dyn_arr = std::vector<T>;
dyn_arr<int> nums; // эквивалентно std::vector<int>
using func_ptr = int (*)(int);
Семантически похоже на использование
typedef
, однако псевдонимы типов легче читаются и совместимы с шаблонами С++.using ull = unsigned long long;
constexpr ull operator"" _KB(ull no)
{
return no * 1024;
}
constexpr ull operator"" _MB(ull no)
{
return no * (1024_KB);
}
cout<<1_KB<<endl;
cout<<5_MB<<endl;
По большей части это будут какие-нибудь реальные единицы, такие как kb, mb, км, см, рубли, доллары, евро и т.д. Пользовательские литералы позволяют вам работать с ними как с другими примитивными типами.
Очень удобно для единиц и измерения.
std::initializer_list
std::pair<int, int> p = {1, 2};
std::tuple<int, int> t = {1, 2};
std::vector<int> v = {1, 2, 3, 4, 5};
std::set<int> s = {1, 2, 3, 4, 5};
std::list<int> l = {1, 2, 3, 4, 5};
std::deque<int> d = {1, 2, 3, 4, 5};
std::array<int, 5> a = {1, 2, 3, 4, 5};
Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, это справедливо и для вложенных контейнеров.
auto
& decltype
auto a = 3.14; // double
auto b = 1; // int
auto& c = b; // int&
auto g = new auto(123); // int*
auto x; // error -- `x` requires initializer
auto-типизированные переменные выводятся компилятором на основе типа их инициализатора
for
по диапазонуstd::array<int, 5> a {1, 2, 3, 4, 5};
for (int& x : a) x *= 2;
// a == { 2, 4, 6, 8, 10 }
struct demo
{
int m_var;
demo(int var) : m_var(var) {}
demo() : demo(0) {}
};
demo d;
Конструкторы теперь могут вызывать другие конструкторы из того же класса с помощью списка инициализаторов.
Вообще, фичей у плюсов много, используй их для повышения производительности
Вот статья в тему 21 фича современного C++, которые вам обязательно пригодятся «https://habr.com/ru/companies/otus/articles/741428/»
@cpluspluc