Search code examples
c++constructorstd-variant

how do I replace base constructor call


In recent SO answer, part of the snippet I'm unable to understand whats happening,

struct VariableDepthList : std::variant<std::vector<VariableDepthList>, int> {
private:
    using base = std::variant<std::vector<VariableDepthList>, int>;
public:
    using base::base;
    VariableDepthList(std::initializer_list<VariableDepthList> v) : base(v) {}
};

base(v) is calling ctor of base class, if so what is equivalent to without having using base::base?


Solution

  • what is equivalent to without having using base::base?

    You replace it with what base is an alias for:

    struct VariableDepthList : std::variant<std::vector<VariableDepthList>, int> {
    private:
    public:
        VariableDepthList(std::initializer_list<VariableDepthList> v) :
            std::variant<std::vector<VariableDepthList>, int>(v) // was "base(v)"
       {}
    };
    

    Note though that without using the base class constructors, they will not be accessible to users of VariableDepthList.

    If you do want the base class constructors to be available, without creating the alias base:

    struct VariableDepthList : std::variant<std::vector<VariableDepthList>, int> {
    private:
    public:
        using std::variant<std::vector<VariableDepthList>, int>::variant;
        
        VariableDepthList(std::initializer_list<VariableDepthList> v) :
            std::variant<std::vector<VariableDepthList>, int>(v) // was "base(v)"
       {}
    };