构造函数的条件调用

Conditional invocation of constructor

本文关键字:调用 条件 构造函数      更新时间:2023-10-16

假设某些类foo具有两个自定义构造函数,例如foo::foo(bar const &)foo::foo(baz const &)。根据某种条件的不同,将被认为是援引任何一种的好风格。例如:

bar a;
baz b;
foo my_foo;
if (...) {
    my_foo = foo(a);
} else {
    my_foo = foo(b);
}

将要求foo默认可构造(在我想到的具体情况下,这不是很明智),并且本质上是浪费时间(和内存)在默认构建的临时对象的创建(和删除)上。由于范围,一个人无法在IF内部声明my_foo或其他障碍。

另一种选择是使用new使用指针和构造。这将效率较低(间接,堆分配),并且可能不安全(不能保证指针不会悬挂;需要delete,尽管可以通过使用std::unique_ptr来照顾后者)。

我找到了一种方法:

foo my_foo = (...) ? foo(a) : foo(b);

是因为三元操作员保证详尽而起作用,因此范围不是问题。

我不是三元操作员的忠实拥护者,可能希望在调用CTOR之前在条件块中做其他事情。是否有一种优雅的方法可以使用传统的IF-ELSE语法?

您可以使用lambda

const foo my_foo = [&] 
    {
          if (...) 
               return foo(a);
          else 
               return foo(b);
    } ();