Вариативные шаблоны позволяют создавать шаблоны, принимающие переменное количество параметров. Это особенно полезно для обобщенных алгоритмов и контейнеров. Примеры использования вариативных шаблонов в стандартной библиотеке включают 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;
}