Search code examples
c++constructorstd-variant

How to delegate constructors for std::variant?


I have two structs A1 and A2 and another struct B has constructors for both. How do I write a delegating constructor for std::variant<A1,A2>?

#include <variant>
struct A1 {};
struct A2 {};
using A = std::variant<A1, A2>;

struct B {
  B(const A1 &){}
  B(const A2 &){}
  B(const A& a)
      :B(a) // <--- what do I put here to delegate like std::visit ?
  {}
};

int main(int argc, char *argv[]) {
    return 0;
}

I am looking for a clean modern way in the spirit of std::visit. I know that I can use a static member function to construct a B instance from A using std::visit and a lambda but that's not what I am asking for since I want to rely on implicit type conversion from A to B.


Solution

  • If you can use the copy constructor, you can do this (not scalable but work in this case) :

    struct B {
          B(const A1 &){}
          B(const A2 &){}
          B(const A& a)
              : B((a.index() == 0) ? B(std::get<0>(a)) : B(std::get<1>(a)))
          {}
        
        };
    

    alternative with std::visit :

    struct B {
       B(const A1 &){}
       B(const A2 &){}
       B(const A& a) : 
           B(std::visit([](const auto & x)
                {
                     return B(x);
                },a))
          {}
    };