c++ - 有条件地实例化一个具有已删除的默认构造函数的类

标签 c++ scope instantiation

<分区>

考虑一个具有删除的默认构造函数的类(我的实际类要复杂得多,默认构造函数被隐式删除,因为它的一个成员具有删除的默认构造函数)。我想根据一些输入的值用它的一个构造函数实例化我的类,然后做“一堆事情”。 以下代码显示了由于代码注释中所述的原因而无法完成的两种方法,但给出了我正在尝试实现的目标的想法。

#include <vector>
class A {
    bool m_with_v;
    int m_i;
    std::vector<double> m_v;
public:
    A() = delete;
    A(int i) : m_i(i), m_with_v(false) {}
    A(int i, std::vector<double> v) : m_i(i), m_v(v), m_with_v(true) {}
    auto do_stuff() { /* do stuff depending on m_with_v */ };
};

int main(int argc, char* argv[])
{
    bool yes_no;
    /* Obtain a value for yes_no from argv */

    A a; // the default constructor of "A" cannot be referenced -- it is a deleted function
    if (yes_no)
        a = A(1);
    else {
        std::vector<double> v{ 1,2,3 };
        a = A(1, v);
    }
    a.do_stuff();
    // do a bunch more things

    if (yes_no)
        A b(1);
    else {
        std::vector<double> v{ 1,2,3 };
        A b(1, v);
    }
    b.do_stuff(); // identifier "b" is undefined, i.e. it's gone out of scope
    // do a bunch more things
}

一个明显的方法是将“一堆东西”移动到 if block 的每个部分内,但这会导致大量重复代码,我想避免这种情况.

另一种明显的方法是创建一个函数来执行“一堆事情”并在 if block 的每个部分调用它,但这需要一定数量的重构和函数调用如果有大量变量需要传递给它,可能会变得相当丑陋。

所以,我的问题是:是否有某种方法可以有条件地实例化我的类并使其在周围范围内可用?

最佳答案

您可以使用条件运算符实例化它:

A a = yes_no ? A(1) : A(1, {1,2,3});
a.do_stuff();

等等。

关于c++ - 有条件地实例化一个具有已删除的默认构造函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286248/

相关文章:

c++ - glCreateShader 给出相同的 ID

C++:使用for循环创建多个数据结构

c# - ASP.NET C# 作用域问题

c++ - 了解类模板特化示例的隐式实例化

c++ - SHA256 : Padding a 512 bits length message

c++ - 有没有我可以使用 opengl 3+ 的虚拟机? virtualbox 和 vmware 没有

php - PHP函数作用域

c++ - 在 C++ 中实例化实例变量的正确方法

c++ - 未知的 C++ 对象实例化语法

c++ - 无法在 C++ 错误中实例化抽象类