web-dev-qa-db-ja.com

C ++でジェネリック構造体を比較する方法は?

構造体を一般的な方法で比較したいのですが、次のようなことをしました(実際のソースを共有できないため、必要に応じて詳細を尋ねます)。

template<typename Data>
bool structCmp(Data data1, Data data2)
{
  void* dataStart1 = (std::uint8_t*)&data1;
  void* dataStart2 = (std::uint8_t*)&data2;
  return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0;
}

2つの構造体インスタンスが同じメンバーを持っているにもかかわらず(Eclipseデバッガーで確認しました)、時々falseを返すことを除いて、これはほとんど意図どおりに機能します。いくつか検索した後、使用された構造体が埋め込まれているため、memcmpが失敗する可能性があることを発見しました。

パディングに無関心なメモリを比較するより適切な方法はありますか?使用する構造体を変更することはできません(使用しているAPIの一部です)。使用する多くの異なる構造体にはいくつかの異なるメンバーがあるため、一般的な方法で個別に比較することはできません(私の知る限り)。

編集:残念ながら、C++ 11に悩まされています。これは以前に言及したはずです...

13
Fredrik Enetorp

私はあなたがAntony Polukhinの素晴らしく悪意のあるブードゥー magic_get ライブラリ-構造体用であり、複雑なクラス用ではありません。

そのライブラリーを使用して、純粋に一般的なテンプレートのコードで、構造体のさまざまなフィールドを適切なタイプで反復できます。 Antonyはこれを使用して、たとえば、任意の構造体を正しい型の出力ストリームに完全に総称的にストリーミングできるようにしました。比較もこのアプローチの可能なアプリケーションである可能性があることは当然のことです。

...しかし、C++ 14が必要になります。少なくともそれはC++ 17と他の回答での後での提案よりも優れています:-P

0
einpoklum