有没有C++方法允许多次使用函数指针而不创建临时变量
Is there C++ method that allow to use function pointer multiple times without creating temporary variable?
我有一个想法或只是一个关于在某些用法中替换临时变量的问题。
使用相同功能减少代码是使代码更易于阅读的好策略。
例如,如果有一些函数返回指针,并且我们需要多次使用结果指针,而不是我们需要编码:
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_ptr
和std::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/
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- 如何在循环中动态创建变量(c++)
- 创建变量之间的运算符排列
- 是否有一种方法可以调用一个函数,而不会创建变量,而不会创建变量
- 在使用该名称创建变量后调用本机 C 函数
- C++ 仅当模板参数为 true 时才创建变量
- 创建变量实例有什么不同?
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 为什么在默认构造函数中使用括号会导致创建变量?
- 动态创建变量名称的替代方法
- C++:使用void创建变量
- 如何在Arduino中从SD卡创建变量
- 应该如何使用C++11 Regex从存储在文本文件中的表中创建变量
- 从文本文件导入的不同线类型创建变量
- 创建变量的别名
- 避免在此模板代码中创建变量
- 类方法中创建变量的作用域
- 动态创建变量c++ /cli . net
- 使用来自文件的输入创建变量
- 创建变量名别名的方法