Вариативные шаблоны позволяют создавать шаблоны, принимающие переменное количество параметров. Это особенно полезно для обобщенных алгоритмов и контейнеров. Примеры использования вариативных шаблонов в стандартной библиотеке включают std::tuple, std::variant, std::make_shared, и std::apply.

Примеры кода

std::tuple

std::tuple — это контейнер, который может содержать несколько значений различных типов.

Пример использования std::tuple

#include <iostream>
#include <tuple>
#include <string>
 
int main() {
    std::tuple<int, double, std::string> t(1, 2.5, "example");
 
    std::cout << std::get<0>(t) << " "; // Output: 1
    std::cout << std::get<1>(t) << " "; // Output: 2.5
    std::cout << std::get<2>(t) << std::endl; // Output: example
 
    return 0;
}

std::variant

std::variant — это контейнер, который может хранить одно значение из набора типов.

Пример использования std::variant

#include <iostream>
#include <variant>
#include <string>
 
int main() {
    std::variant<int, double, std::string> v;
    v = 10;
    std::cout << std::get<int>(v) << std::endl; // Output: 10
 
    v = "Hello";
    std::cout << std::get<std::string>(v) << std::endl; // Output: Hello
 
    return 0;
}

std::make_shared

std::make_shared — это функция, которая создает объект и возвращает std::shared_ptr на него.

Пример использования std::make_shared

#include <iostream>
#include <memory>
 
class MyClass {
public:
    MyClass(int a, double b) : a(a), b(b) {}
    void print() const {
        std::cout << "a: " << a << ", b: " << b << std::endl;
    }
private:
    int a;
    double b;
};
 
int main() {
    auto ptr = std::make_shared<MyClass>(10, 20.5);
    ptr->print(); // Output: a: 10, b: 20.5
 
    return 0;
}

std::apply

std::apply — это функция, которая позволяет применять кортеж в качестве набора аргументов к функции.

Пример использования std::apply

#include <iostream>
#include <tuple>
#include <functional>
 
void printValues(int a, double b, const std::string& c) {
    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl;
}
 
int main() {
    auto t = std::make_tuple(1, 2.5, "example");
    std::apply(printValues, t); // Output: a: 1, b: 2.5, c: example
 
    return 0;
}