简体   繁体   中英

How to implement a class that has one of either two types for an arg

if I have a c++ class like:

class Student
{ 
    public: 

    string name;
    int assigned_number;      
};

and I want to use either name or number but not both for each instance, is there a way to make this an Or type where only one of them is required?

If you are using C++17 or above , you can use std::variant from <variant> :

#include <iostream>
#include <variant> // For 'std::variant'

class Student
{
public:
    std::variant<std::string, int> name_and_id;
};

int main() {
    Student stud; // Create an instance of student

    // Pass a string and print to the console...
    stud.name_and_id = "Hello world!";
    std::cout << std::get<std::string>(stud.name_and_id) << std::endl;

    // Pass an integer and print to the console...
    stud.name_and_id = 20;
    std::cout << std::get<int>(stud.name_and_id) << std::endl;
}

std::variant is a new addition to C++17 and is intended to replace the unions from C and has exceptions in case of errors...

You can use union.

#include <string>

class Student
{
    // Access specifier 
public:
    Student()
    {

    }
    // Data Members
    union
    {
        std::string name;
        int assigned_number;
    };
    ~Student()
    {

    }
};

int main()
{
    Student test;
    test.assigned_number = 10;
    test.name = "10";
    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM