Полный перечень 17 расширенных функций C++17.
Полный перечень 17 расширенных функций C++17.

Полный перечень 17 расширенных функций C++17.

C++17 — одна из наиболее часто используемых в настоящее время версий. Сегодня я потрачу время на то, чтобы разобраться в 17 важных функциях.

1. Параллельный алгоритм

C++17 представляет параллельные версии многих алгоритмов из стандартной библиотеки. Эти алгоритмы могут выполняться параллельно и, следовательно, могут привести к значительному повышению производительности многоядерных систем.

Ранее я написал статью, в которой подробно описывается эта функция.,Вы можете прочитать это:Будущее уже здесь: C++17 Параллельная оценка производительности STL

пример:

Язык кода:javascript
копировать
#include <algorithm>
#include <vector>
#include <execution>
int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::sort(std::execution::par, v.begin(), v.end());
}

существуют В этом примере,std::sortвыполняются параллельно,Распараллелить векторыvэлементы для сортировки。

2. If Initializers

Инициализатор if в C++17 — это функция, позволяющая инициализировать переменные непосредственно в операторе if. Этот метод инициализации может в определенной степени улучшить читаемость и простоту кода.

В традиционном C++ мы обычно инициализируем переменные следующим образом:

Язык кода:javascript
копировать
int x;
if (condition) {
    x = 42;
} else {
    x = 24;
}

В C++17 вы можете использовать инициализатор if, чтобы упростить этот процесс и сделать код более компактным:

Язык кода:javascript
копировать
if (bool condition = /* some condition */) {
    int x = 42;
} else {
    int x = 24;
}

существуют В этом примере,мы будемпеременнаяxИнициализация ставится напрямуюсуществоватьifв предложении。переменнаяconditionсуществоватьifв предложенииопределяетсяиинициализация,Тогда доступен блок операторов существования if. Этот метод более интуитивен и лаконичен.,Особенно когда существуют простая условная инициализация.

3. Вывод параметров шаблона класса (CTAD)

CTAD позволяет компилятору автоматически выводить параметры шаблона из параметров класса. Это упрощает использование шаблонов без необходимости явного указания параметров шаблона.

Подробное объяснение этой функции в предыдущих выпусках.:Вывод параметров шаблона C++17 (CTAD), например, те, что приведены в начале.

Например, следующий пример шаблона функции (до C++17):

Язык кода:javascript
копировать
template <typename T>
void foo(T t) {
    // ...
}

int main() {
    foo(42);  // компилировать приходит к выводу, что тип T — int
}

существуют В этом примере,при звонкеfoo(42)час,компилироватьвыводTТипint.

4. template <auto>

Ключевые слова шаблона вводятся в качестве заполнителей для нетиповых параметров шаблона. Это позволяет представлять в шаблоне значения любого типа.

пример:

Язык кода:javascript
копировать
template<auto value>
struct constant {
    static constexpr auto get_value() { return value; }
};

// использование
static_assert(constant<42>::get_value() == 42);

5. std::optional — std::variant

std::optional и std::variant даC++17Два новых типа, представленные в。std::optional Представляет значение, которое может содержать или не содержать существующее,std::variant Представляет типобезопасное объединение, которое может содержать значения разных типов.

пример:

Язык кода:javascript
копировать
#include <optional>
#include <variant>

int main() {
    std::optional<int> opt = 42;
    std::variant<int, double> var = 3.14;
}

существуют В этом примере,optда Содержит значение42необязательное целое число,varда Содержит значение3.14Варианты。

6. Складные выражения

существоватьC++17середина,выражение складки обеспечивает краткий способ,Используется для выполнения двоичных операций с пакетами параметров. Они позволяют существовать таким операциям, как поиск, умножение или объединение элементов в пакете параметров, не требуя явной рекурсии или итерации.

Например:

Язык кода:javascript
копировать
#include <iostream>

template<typename T>
T sum(T t) {
    return t;
}

// использоватьвыражение Рекурсивный случай складки
template<typename T, typename... Args>
T sum(T first, Args... args) {
    return first + sum(args...);
}

int main() {
    int total = sum(1, 2, 3, 4, 5);
    std::cout << «Генерал и: " << total << std::endl;
    
    return 0;
}

рекурсияsumфункциясерединаизвыражение складки(first + ... + args)Пакет параметровсерединаиз每个元素应用了加法操作。

7. Структурированная привязка

Структурная привязка позволяет разложить объект на составные элементы, аналогично тому, как это можно сделать при распаковке кортежа.

Предыдущие статьи:C++17структурированная привязка

пример:

Язык кода:javascript
копировать
#include <tuple>
#include <string>
int main() {
    std::tuple<int, std::string, double> t(42, "hello", 3.14);
    auto [i, s, d] = t;  // i = 42, s = "hello", d = 3.14
}

существуют В этом примере,структурированная привязка[i, s, d]будет складываться в кортежtразбит на составные элементы。

8. Параметры шаблона шаблона

Например:существоватьC++17середина,грамматика template<template<class...>typename bob> struct foo {} объявляет файл с именем foo шаблон, который принимает шаблон с именем bob Параметры шаблона шаблона. Параметры шаблона шаблона bob сам принимает любое количество параметров типа шаблона.

Язык кода:javascript
копировать
template <template<class...> typename bob>
struct foo {
    template<typename T>
    void bar(const bob<T>& arg) {
        std::cout << "size: " << arg.size() << std::endl;
    }
};

int main() {
    foo<std::vector> f;
    std::vector<int> vec = {1, 2, 3, 4, 5};
    f.bar(vec);

    return 0;
}

существовать main функция, мы используем std::vector создан экземпляр foo,относиться к этому как bob параметры шаблона. Это позволяет нам создать общую структуру. foo,Работает с любым шаблоном, который принимает любое количество параметров типа.,Например std::vectorstd::list или пользовательский шаблон.

9. Встроенные переменные

C++17 позволяет определениям классов внутри переменных быть встроенными.,Это может помочь уменьшить размер двоичного файла.,Возможно повышение производительности за счет предотвращения дублирования переменныхсуществовать в нескольких единицах перевода.

пример:

Язык кода:javascript
копировать
class MyClass {
public:
    inline static int inlineVar = 42;
};

int main() {
    int localVar = MyClass::inlineVar;
}

существоватьздесь,inlineVarдаMyClassвстроенные статические членыпеременная。

10. Улучшения недвижимости

C++17 предоставляет новые свойства и улучшает существующие, позволяя разработчикам предоставлять компилятору дополнительную информацию о поведении кода.

пример:

Язык кода:javascript
копировать
[[nodiscard]] int get_sum(int a, int b) {
    return a + b;
}

int main() {
    auto result = get_sum(1, 2);
    // компилировать может предупредить, что 'result' не используется
}

существуют В этом примере,[[nodiscard]]даможет быть применен кфункцияхарактеристики,Указывает, что возвращаемое значение не должно отбрасываться вызывающей стороной.

11. Вложенные пространства имен

В C++17 шаблон переменных параметров расширен за счет выражения складки, что делает код, когда существование обрабатывает пакеты параметров, более кратким и понятным.

пример:

Язык кода:javascript
копировать
// внешнее пространство имен
namespace outer {
    // внутреннее пространство имен
    namespace inner {
        void foo() {
            std::cout << "существоватьвнутреннее пространство именсередина" << std::endl;
        }
    }
}

outer::inner::foo();

Определение вложенных пространств имен обеспечивает способ иерархической организации кода.,Улучшенная читаемость и удобство обслуживания.,Особенно в масштабных проектах. Они также помогают избежать конфликтов имен, обеспечивая более структурированную иерархию пространств имен.

12. Буквальные улучшения

C++17 расширяет возможности литералов,Включает улучшения целочисленных литералов и литералов с плавающей запятой.,И поддержка истинных и ложных литералов.

пример:

Язык кода:javascript
копировать
auto num = 123_456; // Underscore in integer literals  
auto pi = 3.1415_f; // Suffix for floating-point literals

13. constexpr Lambda

C++17 позволяет лямбда-функции быть constexpr,если они соответствуют условиям,Вот и всесуществоватьнуждатьсякомпилироватьчас评估из上下文серединаиспользовать,Например:

Язык кода:javascript
копировать
constexpr auto lambda = [](int x) { return x * 2; };
static_assert(lambda(5) == 10);

существуют В этом примере,lambdaдаодинconstexpr lambda,Он принимает целое число x в качестве аргумента.,затем вернисьxв два раза。static_assertисследоватьсуществоватькомпилироватьчас,lambda(5)ценитьда Нет равных10。

14. Сфотографируйте *это

Существующая лямбда делает захват*это еще проще, обеспечивая прямой доступ к членам содержащего объекта.

Язык кода:javascript
копировать
class Foo {
    int data = 42;
public:
    auto member_lambda() {
        return [*this] { std::cout << data << std::endl; };
    }
};

// использовать
Foo f;
f.member_lambda()(); // выход "42"

15. Расширенные операторы if и switch

ifилиswitchв предложениииз条件现существовать Можетдалюбое выражение,Не ограничивается логическими условиями. Это делает поток управления более гибким.,Напримериспользоватьструктурированная привязкачас:

Язык кода:javascript
копировать
if (const auto [it, inserted] = map.insert({"foo", bar}); inserted) {
    // ...
}

существуют В этом примере,ifзаявлениеисследоватьinsertedпеременнаяда Нет, это правда,Но в условия входит и структурированная Назначение привязки.

16. Обобщенный цикл for на основе диапазона

Это улучшение поддерживает другой тип флага или конечного итератора, чем начальный итератор, что помогает обрабатывать циклы с нулевым завершением и другие подобные случаи. Например:

Язык кода:javascript
копировать
for (auto it = my_container.begin(); it != my_container.end(); ++it) {
   // ...
}

существуют В этом примере,my_containerвозможныйдаиспользовать Контейнеры разных типов конечных итераторов,Но цикл по-прежнему работает правильно.

17. if constexpr

Эта функция оценивает условия, позволяя компилируемому устройству существовать компилировать.,В результате получается более общий код. если условие верно,нокомпилироватьиз代码середина Включатьifкод внутри блока;нетно,Оно будет отброшено. Это упрощает код за счет удаления ненужных ветвей во время выполнения. Например:

Язык кода:javascript
копировать
if constexpr (std::is_same_v<T, int>) {
   // конкретный код для int
} else {
   // для других типов кода
}

существуют В этом примере,if constexprзаявлениеисследоватьтипTданет为int,и соответственно включите соответствующий код.

Подвести итог

Это все, что касается этого раздела, а остальное содержимое будет объяснено в следующем разделе.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose