Я пытаюсь реализовать делегированный конструктор без инициализации. Это потому, что мне нужны соответствующие значения, полученные вызовом функции. Как написать правильный код без повторения кода?
class foo
{
private:
// Something
public:
foo() = delete;
foo(double a, double b, double c)
{
// Something
}
foo(int n)
{
double a, b, c;
// a, b, c passed by reference and appropriate value is obtained here.
function_call(n, a, b, c);
// construct this object as if the call is foo(a, b, c) now
foo(a, b, c); // ??? Does this work?
}
};
foo(a, b, c); // ??? Does this work?
Нет, это не работает. Он создает временный объект и не может инициализировать переменные-члены текущего объекта.
Мое предложение:
Измените function_call
, чтобы вернуть std::tuple<double, double, double>
вместо обновления значений объектов, переданных по ссылке.
Затем вы можете использовать:
class foo
{
private:
foo(std::tuple<double, double, double> const& t) : foo(std::get<0>(t), std::get<1>(t), std::get<2>(t)) {}
public:
foo() = delete;
foo(double a, double b, double c)
{
// Something
}
foo(int n) : foo(function_call(n)) {}
};
Вы также можете использовать std::array<double, 3>
в качестве возвращаемого значения function_call
и соответствующим образом обновить конструктор.
foo(std::array<double, 3> const& arr) : foo(arr[0], arr[1], arr[2]) {}