1. ホーム
  2. c++

[解決済み] タプルとタイで比較演算を実装するのは良いアイデアか?

2022-10-05 05:39:17

質問

(注 tupletie は Boost または C++11 から取ることができます)。

要素が2つしかない小さな構造体を書くとき、私はときどき std::pair のように、重要なことはすべてそのデータ型に対してすでに行われているためです。 operator< のように、そのデータ型に対して既に行われているからです。

しかし、欠点は、かなり無駄な変数名です。たとえ私自身がその typedef を作ったとしても、2日後には何を作ったか覚えていないでしょう。 first とか second がまさにそうであったように、特にそれらが両方とも同じ型である場合はそうです。これは2つ以上のメンバーではさらに悪くなります。 pair の入れ子はかなり最悪です。

そのためのもう一つの選択肢は tuple であり、Boost または C++11 のものですが、これでは見た目がすっきりしません。そこで、必要な比較演算子を含め、構造体を自分で書くことに戻りました。

特に operator< はかなり面倒なので、この混乱を回避するために、私はただ tuple :

の例 operator< は、例えば strict-weak-ordering のためのものです。

bool operator<(MyStruct const& lhs, MyStruct const& rhs){
  return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
         std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}

( tie を作る tupleT& を参照します)。


編集 : の非公開継承という @DeadMG さんの提案。 tuple を非公開で継承するという @DeadMG からの提案は、悪いものではありませんが、かなり多くの欠点があります。

  • 演算子が独立したものである場合(おそらく友人)、私は公に継承する必要があります。
  • キャスティングで、私の関数 / 演算子 ( operator= 特に) は簡単にバイパスすることができます。
  • を使用すると tie ソリューションでは、順序付けに重要でない場合、特定のメンバーを省くことができます。

この実装で考慮しなければならない欠点はありますか?

どのように解決するのですか?

これは確かに、自分でロールバックするよりも正しい演算子を書く方が簡単になりそうです。プロファイリングにより、比較操作がアプリケーションの時間のかかる部分であることが示された場合にのみ、別のアプローチを検討するように言っておきます。そうでなければ、これを維持することの容易さは、考えられるパフォーマンスの懸念を上回らなければなりません。