Как создать объект из кортежа, когда у него нет конструктора

#c #constructor #tuples

#c #конструктор #Кортежи

Вопрос:

Если у меня есть класс, у которого есть определенный конструктор:

 class Point
{
public:
    Point(int x, int y);
    // ...
};
  

И std::tuple :

 using Tuple = std::tuple<int,int>;
  

Я могу создать класс, используя кортеж, вызвав std::make_from_tuple :

 void f()
{
    Tuple tuple = {1,2};
    auto point = std::make_from_tuple<Point>(tuple);
}
  

Если, например, мой класс использует только фабричные методы и не имеет определенного конструктора:

 class Point
{
    Point() = delete;

public:
    static Point from_coordinates(int x, int y);
    // ...
};
  

По-видимому, я не могу настроить std::make_from_tuple использование чего-либо другого в качестве конструктора.

Существует ли более общая реализация std::make_from_tuple , доступная в STL или в Boost? Можно ли использовать что-нибудь еще для достижения того же результата?

Комментарии:

1. Если вы посмотрите make_from_tuple на cppreference.com , вы точно увидите, что он делает, и вы должны быть в состоянии просто адаптировать его к использованию вашего заводского метода. Что довольно близко к тому, что std::apply делает. Вероятно, вы можете передать лямбда std::apply -выражение, которое пересылает его аргументы на вашу фабрику.

2. Есть ли причина не реализовывать Point(Tuple xy); constructor?

3. @Eljay предположим, что код класса получен от третьей стороны, и вы не можете его изменить

4. Тогда вы могли бы создать автономную Point to_Point(Tuple xy); фабричную функцию.

Ответ №1:

Вы можете использовать std::apply для вызова from_coordinates с std::tuple помощью . Это будет выглядеть так

 auto point = std::apply(Point::from_coordinates, tuple);