有没有一种简单的方法来模拟局部函数?

Jac*_*own 0 c++ lambda member-functions local-functions

我有一个成员函数需要访问成员数据和“本地”数据:

struct S final
{
   int i = 123;
   // ... a bunch of legacy code ...
   void f()
   {
      // ... a bunch of legacy code ...
      double d = 1.23;
      // ... a bunch of legacy code ...
      g(d);
      // ... a bunch of legacy code ...
   }
   // ... a bunch of legacy code ...
   void g(double& d)
   {
      i = 456; d = 4.56;
   }
};
Run Code Online (Sandbox Code Playgroud)

这当然是有效的......但是,随着更多本地变量被f()传递到g(). 有没有一种“简单”的方法可以避免这种情况?

使用 lambda 是“常规”答案,但这意味着 的代码g()必须移至f();的一部分。我不想这样做:

struct S final
{
   int i = 123;
   void f()
   {
      double d = 1.23;
      auto g = [&]() { i = 456; d = 4.56; } // code moved here :-(
      g(d);
   }
};
Run Code Online (Sandbox Code Playgroud)

像这样的东西很接近(尽管 lambda “更好”,因为局部变量是闭包的一部分[&]),但它不是有效的 C++

struct S final
{
   int i = 123;
   void f()
   {
      double d = 1.23;
      void g();
      g();
   }
   void f::g()
   {
      i = 456; d = 4.56;
   }
};
Run Code Online (Sandbox Code Playgroud)

或者(再次使用虚构的语法)一种声明lambda 并稍后定义它的方法:

struct S final
{
   int i = 123;
   void f()
   {
      double d = 1.23;
      auto g = [&]();
      g();
   
      g = { i = 456; d = 4.56; }
    }
};
Run Code Online (Sandbox Code Playgroud)

Moo*_*uck 5

只需将它们放入结构中即可

struct S final
{
   struct g_params { //that's it
      double d;
   };

   int i = 123;
   void f()
   {
      g_params d = {1.23};
      g(d);
      // ... assume this is already a large function ...
   }
   // ... lots of code here ...
   void g(g_params& p)
   {
      i = 456; p.d = 4.56;
   }
};
Run Code Online (Sandbox Code Playgroud)