#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);