委托构造函数而无需初始化

时间:2019-04-08 20:08:58

标签: c++11

我试图在不初始化的情况下实现委托构造函数。这是因为我需要通过函数调用获得适当的值。如何编写没有代码重复的正确代码?

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?
    }
};

1 个答案:

答案 0 :(得分:1)

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]) {}