使用 base class 调用 placement new

Calling placement new using base class

我对位置有疑问 new。我想在 class 派生方法中调用 Base Class 构造函数。代码应该使这一点更清楚。

代码

#include <iostream>
#include <string>
#include <type_traits>
#include <optional>


double calculate_z(int x) {
    return 2 * x;   
}

struct Base {
    int x;
    double z;

    Base(): x(0), z(0) {}
    Base(int value): x(value), z( calculate_z(x)) {}
};

class Derived: public Base {
public:
    //is this enought to make it safe? 
    static_assert( std::is_trivially_copyable<Base>::value, "Object using new in placement constructor has to be trivial!");
    std::optional<bool> force; 

    void load(int x)
    {
        new(this) Base(x); //can I call it safty? will this couse any trouble with force member? 
        // Do I need to call destructor manualy or delate? (probalby no)
        force = std::make_optional(false);
    }
};

int main()
{
    Derived a;
    a.load(5);
}

Link do online compiler

原因

例子看起来点少。但是 class 不是 Base,而是 T。导数是template。我需要调用此构造函数,因为我从 JSON 读取数据。我使用的序列化库已经需要现有的那个对象。不从 Base 继承是一个问题(因为我可以使用 Base 作为成员)。那么为什么我需要调用构造函数呢?因为 T 来自其他库而不调用构造函数使我的应用程序无法正常工作。

所以问题:

  1. 我的程序安全吗?
  2. 如果 1 是,一个特征是否足以用模板替换 Base?
  3. 如果不是,我怎样才能保证安全?

基地成员

我无法将 Base 作为成员,因为我使用 http://uscilab.github.io/cereal/serialization_functions.html

对其进行了序列化

你想在这里写什么?在您列出的 link 中没有任何地方 这样的建议。

看来你想要的是:

struct Base {
    int x;
    double z;

    Base(): x(0), z(0) {}
    Base(int value): x(value), z( calculate_z(x) ) {}
};

class Derived : public Base {
    std::optional<bool> force; 

    template<class Archive>
    void serialize(Archive & archive)
    {
        archive( x, z, force );
    }
};

class Safer {
    Base b;
    std::optional<bool> force; 

    template<class Archive>
    void serialize(Archive & archive)
    {
        archive( b.x, b.z, force );
    }
};

class Constructs {
    Base b;
    std::optional<bool> force; 

    template<class Archive>
    void load(Archive & archive)
    {
        int x, z;
        archive( x, z, force );
        b = Base( x );
        // Could be
        // b = Base( x, z );
    }

    template<class Archive>
    void save(Archive & archive)
    {
        archive( b.x, b.z/*???*/, force );
    }
};