std::variant in C++ 17
Last Updated :
05 Oct, 2023
In the world of modern C++ programming, the std::variant is a powerful tool that allows you to work with multiple data types in a flexible and type-safe manner. In this article, we will discuss std::variant and explore its fundamentals, applications, and benefits with practical code examples.
Prerequisites: C++ data types, functions, unions, and classes.
What is std::variant?
A variant is a data type introduced in C++ 17 that can hold values of different types, much like a union in C. However, std::variant brings type safety to the table, making it a safer and more versatile alternative.
How Does std::Variant Work?
At its core, std::variant is a union of types. It can store one value at a time from a predefined set of types. Unlike a traditional union, std::variant keeps track of its active type, ensuring that you access the correct value.
Types Supported by std::Variant
std::variant can hold values of various data types, including fundamental types (int, double, etc.), user-defined types (custom classes or structs), and even other variants. This flexibility opens up a world of possibilities for handling complex data scenarios.
Syntax of std::variant
std::variant <Types...> var_name;
where,
- Types: All possible type of data that the variant may have to store.
- var_name: variant object name.
Methods Associated with std::variant
Some methods associated with std::variant to provide different facilities. Some of them are as follows:
S.No
|
Method
|
Description
|
1
|
index() |
Returns the index of the type of data stored in the variant. |
2
|
emplace() |
In place construction of the value of the variant. |
3
|
holds_alternative() |
Check if the given type of data is stored inside the variant at the given moment in time. |
4
|
get() |
It retrieves the value of the given type or index from the variant. |
Examples of std::variant
Let’s illustrate the std::variant with some code examples.
Example 1
C++
#include <iostream>
#include <string>
#include <variant>
using namespace std;
int main()
{
variant< int , double , string> myVariant;
myVariant = 42;
if (holds_alternative< int >(myVariant)) {
cout << get< int >(myVariant) << endl;
}
myVariant = 3.14;
if (holds_alternative< double >(myVariant)) {
cout << get< double >(myVariant) << endl;
}
myVariant = "Hello, Variant!" ;
if (holds_alternative<string>(myVariant)) {
cout << get<string>(myVariant) << endl;
}
return 0;
}
|
Output
42
3.14
Hello, Variant!
Example 2
C++
#include <iostream>
#include <variant>
using namespace std;
struct Circle {
double radius;
};
struct Square {
double side;
};
int main()
{
variant<Circle, Square> shapeVariant;
shapeVariant = Circle{ 5.0 };
if (holds_alternative<Circle>(shapeVariant)) {
Circle c = get<Circle>(shapeVariant);
cout << "Circle with radius: " << c.radius << endl;
}
else if (holds_alternative<Square>(shapeVariant)) {
Square s = get<Square>(shapeVariant);
cout << "Square with side: " << s.side << endl;
}
else {
cout << "Unrecognized shape" << endl;
}
return 0;
}
|
Output
Circle with radius: 5
Applications of std::Variant
Following are some main applications of the std::variant:
- Handling Multiple Data Types: One of the most common use cases for std::variant is when you need to work with functions or classes that can accept different data types. Instead of writing multiple overloads, you can use a variant to streamline your code and make it more maintainable.
- State Machines: State machines, a crucial concept in software engineering, often require managing different states and transitions. std::variant simplifies this by allowing you to represent states as types and transitions as functions, resulting in clean and efficient code.
Share your thoughts in the comments
Please Login to comment...