Open In App

std::variant in C++ 17

Last Updated : 05 Oct, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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++




// C++ Program to illustrate std::variant
#include <iostream>
#include <string>
#include <variant>
  
using namespace std;
  
int main()
{
    variant<int, double, string> myVariant;
  
    myVariant = 42; // Assign an int
    // Access the int
    if (holds_alternative<int>(myVariant)) {
        cout << get<int>(myVariant) << endl;
    }
  
    myVariant = 3.14; // Assign a double
    // Access the double
    if (holds_alternative<double>(myVariant)) {
        cout << get<double>(myVariant) << endl;
    }
  
    myVariant = "Hello, Variant!"; // Assign a string
    // Access the string
    if (holds_alternative<string>(myVariant)) {
        cout << get<string>(myVariant) << endl;
    }
  
    return 0;
}


Output

42
3.14
Hello, Variant!

Example 2

C++




// C++ Program to illustrate std::variant
#include <iostream>
#include <variant>
using namespace std;
  
// Define custom data types
struct Circle {
    double radius;
};
  
struct Square {
    double side;
};
  
// driver code
int main()
{
    variant<Circle, Square> shapeVariant;
  
    // Create a Circle
    shapeVariant = Circle{ 5.0 };
  
    // Check the active type and perform operations
    // accordingly
    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 {
        // Handle the case where the variant does not
        // contain either a Circle or a Square
        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.


Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads