(注:tuple
およびtie
BoostまたはC ++ 11から取得できます。)厳密な弱い順序付けのように、すべての重要なものがそのデータ型に対してすでに行われているため
、2つの要素のみを含む小さな構造体を書き込むときstd::pair
、operator<
。
ただし、欠点は、ほとんど役に立たない変数名です。私がそれを作成したtypedef
としても、特に両方が同じタイプである場合は特に、2日後に何が何first
であったかsecond
正確には覚えていません。これは、3つ以上のメンバーの場合はさらに悪化します。これは、入れ子にするpair
ことでほとんど問題になります。
そのための他のオプションはtuple
、BoostまたはC ++ 11のいずれかからですが、実際には見た目が良く、明確ではありません。そこで、必要な比較演算子を含め、自分で構造体を書くことに戻ります。
特にはoperator<
非常に扱いにくい場合があるので、次のように定義された操作に依存するだけで、この混乱全体を回避することを考えましたtuple
。
の例operator<
、例えば厳密な弱い順序付け:
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
は、渡された引数からtuple
のT&
参照を作成します。)
編集:@DeadMGからプライベートに継承するという提案tuple
は悪いことではありませんが、かなりの欠点がありました。
- 事業者が独立している場合(おそらく友人)、私は公に継承する必要があります
- キャストを使用すると、関数/演算子(
operator=
特に)を簡単にバイパスできます tie
解決策により、注文に関係のない特定のメンバーを除外することができます
この実装に考慮する必要がある欠点はありますか?
tie
ビットフィールドメンバーに適用できないことです。
tie(...)
呼び出しがさまざまな演算子(=、==、<など)で複製される場合は、プライベートインラインメソッドmake_tuple(...)
を記述してそれをカプセル化し、次のように他のさまざまな場所から呼び出すことができますreturn lhs.make_tuple() < rhs.make_tuple();
(ただし、その方法は宣言するのが楽しいかもしれません!)
auto tied() const{ return std::tie(the, members, here); }