Search code examples
c++classc++11constructorstdinitializerlist

Constructor using {a,b,c} as argument or what is {a,b,c} actually doing?


I know, that I can initialize data like this.

int array[3] = { 1, 2, 3 };

or even

int array[2][2] = { {1, 2}, {3, 4} };

I can also do it with std::vector

std::vector<int> A = { 1, 2, 3 };

Let's say I want to write my own class:

class my_class
{
     std::vector< int > A;
     public:
     //pseudo code
           my_class(*x) { store x in A;} //with x={ {1, 2}, {3, 4} }
     // do something
};

Is it possible to write such a constructor and how is it possible? What is this statement

{{1, 2}, {3, 4}} actually doing?

I always just find, that you can initialize data in this way, but never what it is doing precisely.


Solution

  • It is called list initialization and you need a std::initilizer_list constructor, that to be achieved in your my_class.

    See (Live Demo)

    #include <iostream>
    #include <vector>
    #include <initializer_list> // std::initializer_list
    
    class my_class
    {
        std::vector<int> A;
    public:
        // std::initilizer_list constructor 
        my_class(const std::initializer_list<int> v) : A(v) {}    
    
        friend std::ostream& operator<<(std::ostream& out, const my_class& obj) /* noexcept */;
    };
    
    std::ostream& operator<<(std::ostream& out, const my_class& obj) /* noexcept */
    {
        for(const int it: obj.A) out << it << " ";
        return out;
    }
    
    int main()
    {
        my_class obj = {1,2,3,4};  // now possible
        std::cout << obj << std::endl;
        return 0;
    }