質問

あなたの時間のために私は本当に感謝しています

CEREALシリアライゼーションライブラリでシリアル化する必要があるテンプル化サブクラスがあります。ベースクラスは空です。複数の変数型のベクトル保存を効果的に許可する

class NetVar_ {};
template <class VARTYPE> class NetVar : public NetVar_
{
public:
    NetVar(VARTYPE Value)
    {
        Var = Value;
    }

    template <class Archive> void serialize(Archive & archive)
    {
        archive(Var);
    }

private:
    VARTYPE Var;
};
.

ベースクラスの次のベクトルは、いくつかのサブクラスを押します:

std::vector<std::shared_ptr<NetVar_>> PacketData;
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<int>>(32));
PacketData.push_back(std::make_shared<NetVar<std::string>>('test'));
.

最後に、ベクトルはシリアル化され、処理のためにリモートマシンに送信されます。

std::ostringstream SData;
{
    cereal::PortableBinaryOutputArchive Archive(SData);
    Archive(PacketData);
    //SData is sent to remote machine here through networking library.
}
.

パズルにキーピースを紛失している必要があるため、出力変数の値をデバッグすると、BASECLASSとORを信じるようになる余白または大きな負の数のいずれかが例外をスローしているため、サブクラスは正しくシリアル化されていません。

コードは、

役に立ちましたか?

解決

ここで選択肢がない、基本クラスインタフェースにアクセスするだけの場合は、多型が必要です。アーカイブもテンプレートタイプになるのを防ぎます。

私はシリアルの存在をテストし、見つからない場合はデフォルトの動作をしているSFINAEを想像しています。それはコンパイルエラーがないので、ここでは事実です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top