有条件调用构造函数[关闭]

2024-01-31

假设某个类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(使用前将#替换为@)

有条件调用构造函数[关闭] 的相关文章

随机推荐