如何委托 std::variant 的构造函数?

phi*_*inz 5 c++ constructor std-variant

我有两个结构A1A2另一个结构B有两个结构的构造函数。如何编写 的委托构造函数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;
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种本着 的精神的干净的现代方式std::visitB我知道我可以使用静态成员函数通过Ausing和 lambda构造实例std::visit,但这不是我所要求的,因为我想依赖从A到 的隐式类型转换B

小智 4

如果您可以使用复制构造函数,则可以执行此操作(不可扩展,但在这种情况下可以工作):

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)))
      {}
    
    };
Run Code Online (Sandbox Code Playgroud)

std::visit 的替代方案:

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