有没有C++方法允许多次使用函数指针而不创建临时变量

Is there C++ method that allow to use function pointer multiple times without creating temporary variable?

本文关键字:创建 变量 指针 函数 方法 C++ 许多次 有没有      更新时间:2023-10-16

我有一个想法或只是一个关于在某些用法中替换临时变量的问题。

使用相同功能减少代码是使代码更易于阅读的好策略。

例如,如果有一些函数返回指针,并且我们需要多次使用结果指针,而不是我们需要编码:

MyType *tempVariable=myFunctionGetNewTempValue();
tempVariable->doThis();
tempVariable->doSomethingElse();
delete tempVariable;

我建议使用更具可读性的代码执行相同的操作:

for_this(MyType *temp_variable, myFunctionGetNewTempValue())
{
temp_variable->doThis();
temp_variable->doSomethingElse();
delete temp_variable;
}

当然,temp_variable应该保留指针函数结果。

再比如:

int temp_variable = 3*400*myVariable/1000.0;
myFunc1(temp_variable);
myFunc2(temp_variable/2);

更换建议:

for_this(int temp_variable, 3*400*myVariable/1000.0)
{
myFunc1(temp_variable);
myFunc2(temp_variable/2);
}

或者也许它应该看起来像这样:

for_this(3*400*myVariable/1000.0)
{
myFunc1(this_result);
myFunc2(this_result/2);
}

temp_variable应该是计算的结果编号 3*400*myVariable/1000.0,并在 } 后自动释放

我通常这样做:

{
int tempVariable=3*400*myVariable/1000.0;
myFunc1(tempVariable);
myFunc2(tempVariable/2);
}

但是我认为一个接一个地做几个块看起来很混乱:

{
int tempVariable=3*400*myVariable/1000.0;
myFunc1(tempVariable);
myFunc2(tempVariable/2);
}
{
int tempVariable2=3*myVariable2/1000.0;
myFunc3(tempVariable2);
myFunc4(tempVariable2/2);
}

在阅读此代码时,我总是问自己"我是否错过了 }{ 之间的'else'?

当temp_variable是一些应该在使用后释放的大结构时,此方法也应该很有用。因此,在这种情况下,我们不会忘记释放它。

有没有C++方法可以做类似的事情?

在C++中,我们使用"智能指针"(如std::unique_ptrstd::shared_ptr(来自动释放资源。 这种技术是"RAII"技术的一部分,该技术在C++中普遍存在(这是一件好事(。 例如:

{
  std::unique_ptr<MyType> tempVariable(myFunctionGetNewTempValue());
  tempVariable->doThis();
  tempVariable->doSomethingElse();
  // tempVariable is destroyed, and so is its referent
}

至于你只是希望一个整数在块的末尾超出范围的情况:

{
  int temp_variable = 3*400*myVariable/1000.0;
  myFunc1(temp_variable);
  myFunc2(temp_variable/2);
}

我不会在生产代码中这样做,但为了论证:

[](std::unique_ptr<auto> p) {
   p->doThis();
   p->doThat();
}(functionCreatesPointer());
[](auto x) {
   myFunc1(x);
   myFunc2(x);
}(3*400*myVariable/1000.);

当然,更简单的方法是按照 John 的建议在其自己的作用域内创建一个变量,您甚至可以在此过程中测试有效的指针,而无需添加太多样板:

if (std::unique_ptr<MyType> p(myFunctionGetNewTempValue())) {
    tmpVariable->doThis();
    tmpVariable->doThat();
}

优化器可能会在三种情况下生成类似的代码:本地 var、lambda、if(除了if情况下的 null-ness 测试(。但是我发现 John 的代码和if对于其他代码维护者来说更容易理解。

当然,语言足够灵活,它给了你足够的绳子来吊死自己,同时也用火箭炸你的脚......(我真的不会在生产中这样做(:

#define for_this(X) 
   if (bool stop = false) ; else 
      for (X; !stop; stop = true)

然后,您可以使用:

for_this(int temp_variable = 3*400*myVariable/1000.0) {
    myFunc1(temp_variable);
    myFunc2(temp_variable);
}

这将扩展到:

if (bool stop = false) ; else 
   for (int temp_variable = 3*400*myVariable/1000.0; !stop; stop = true) {
       myFunc1(temp_variable);
       myFunc2(temp_variable);
   }

优化器将删除条件和循环。这可以通过传递变量名称和初始化来进一步简化:

for_this(x = 3*400*myVariable/1000.0) { … }

唯一的区别是宏会向for添加额外的auto

#define for_this(X) 
   if (bool stop = false) ; else 
      for (auto X; !stop; stop = true)

请不要:)

我个人不会这样做,但你可以写一个宏,比如:

#define with(EXPR) for (auto _ : { EXPR })

扩展到一个循环(后面放置一个主体(,它定义了一个变量_保存你的"临时值"。

然后可以像这样使用它:

with(3*400*myVariable/1000.0) {
    myFunc1(_);
    myFunc2(_/2);
}

现场演示

但是,我看不出仅仅说:

{
    auto _ = 3*400*myVariable/1000.0;
    myFunc1(_);
    myFunc2(_/2);
}

一些编程语言有一个"with"或"using"关键字,用于自动管理资源,有时甚至会改变this指针的含义。一些例子是Pascal,Python,C#和VB6。

C++没有这样的构造,任何创建自定义解决方案的尝试都只会混淆您的代码并产生不必要的复杂性。相反,在C++我们使用一种叫做RAII的东西,你可以看看大量的文章。

http://www.hackcraft.net/raii/