假设某个类foo
有两个自定义构造函数,例如foo::foo(bar const &)
and foo::foo(baz const &)
。根据某些条件调用其中任何一个都被认为是好的风格。例如:
bar a;
baz b;
foo my_foo;
if (...) {
my_foo = foo(a);
} else {
my_foo = foo(b);
}
需要foo
是默认可构造的(在我想到的具体情况下这不是很明智),并且本质上是在创建(和删除)默认构造的临时对象上浪费时间(和内存)。由于范围的原因,无法声明my_foo
在 if 或 else 块内。
另一种方法是使用指针并构造new
。这会降低效率(间接、堆分配)并且可能不安全(不能保证指针不悬空;需要delete
,尽管后者可以通过使用来处理std::unique_ptr
).
我找到了一种方法来做到这一点:
foo my_foo = (...) ? foo(a) : foo(b);
这是有效的,因为三元运算符保证是详尽的,因此范围不是问题。
我不是三元运算符的忠实粉丝,并且可能想在调用构造函数之前在条件块中做一些其他事情。是否有一种优雅的方法可以使用传统的 if-else 语法实现相同的效果?
你可以使用 lambda
const foo my_foo = [&]
{
if (...)
return foo(a);
else
return foo(b);
} ();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)