c++ - 根据可用的参数使用一个或另一个重载的创建者

标签 c++

我有一个对象的两个构造函数,它们使用两组不同的数据。

myclass myobject(set 1);
myclass myobject(set 2);

set 1set 2 是不同的类型。

我想使用构造函数 1 或构造函数 2 创建一个名为 myobject 的 myclass 对象,具体取决于此时可用的参数集,然后在 if 语句之外使用 myobject。

if(set1)
  myclass myobject(set 1);
else
  myclass myobject(set 2);
myobject.operation();

谁能告诉我这样做的好方法?

最佳答案

如果默认构造和复制(或移动)分配很便宜,只需使用:

myclass myobject;
if (set1)
    myobject = myclass(1, 2);
else
    myobject = myclass(3);
myobject.operation();

如果在堆上分配东西是可以接受的,使用指针:

std::unique_ptr<myclass> myobject;
// const std::auto_ptr<myclass> in C++03 (it's fine as long as you keep it unique)
if (set1)
    myobject.reset(new myclass(1, 2));
else
    myobject.reset(new myclass(3));
myobject->operation();

如果您必须在堆栈上分配它,除了使用 placement new(或更改构造函数以接受这两种可能性)之外,我无论如何都看不到。

#include <new>

char myobject_buffer[sizeof(myclass)];
myclass* ptr;
if (set1)
    ptr = new (myobject_buffer) myclass(1, 2);
else
    ptr = new (myobject_buffer) myclass(3);
ptr->operation();
...
ptr->~myclass();  // <-- use RAII to call this for exception safety

关于c++ - 根据可用的参数使用一个或另一个重载的创建者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226221/

相关文章:

c++ - 一个真实帧缓冲区中的多个逻辑缓冲区

c++ - 如果模板参数复杂,则在模板函数中应用std::conj

c++ - 根据构造函数中的参数创建内部对象?

c++ - 删除列表控件 (MFC) 中的重复项

用于计划任务的 C++ 多线程任务队列

c++ - 在 C++ 中计算数组中不相等的字符串

c++ - 模板特化中对基类成员的 undefined reference

c++ - 为什么在没有返回类型的情况下显式调用构造函数时会返回一个临时对象?

c++ - cout << 2 ["abc"] << endl;为什么它有效?它是什么语法?

c++ - 是否有任何关键字可以在模板化派生类中重新定义模板化基类的 "all"方法?