token
位置、文、段落情報の開始/終了ペアを持つ構造が必要です。また、開始/終了ペアとして、および個別に、2つの異なる方法でメンバーにアクセスできるようにします。与えられた:
struct token {
struct start_end {
int start;
int end;
};
start_end pos;
start_end sent;
start_end para;
typedef start_end token::*start_end_ptr;
};
たとえば、次のように3つの/ペアdistance()
のいずれかの間の距離を計算する関数を記述できます。start
end
int distance( token const &i, token const &j, token::start_end_ptr mbr ) {
return (j.*mbr).start - (i.*mbr).end;
}
そしてそれを次のように呼びます:
token i, j;
int d = distance( i, j, &token::pos );
pos
ペアの距離を返します。しかし、私は合格することもできます&token::sent
し&token::para
、それは私が望むことをします。したがって、機能は柔軟です。
ただし、ここで、たとえば、すべてまたはすべてまたはすべてのmax()
最大値を計算する関数も記述したいと思います。pos.start
pos.end
sent.start
追加した場合:
typedef int token::start_end::*int_ptr;
私は次のような関数を書くことができます:
int max( list<token> const &l, token::int_ptr p ) {
int m = numeric_limits<int>::min();
for ( list<token>::const_iterator i = l.begin(); i != l.end(); ++i ) {
int n = (*i).pos.*p; // NOT WHAT I WANT: It hard-codes 'pos'
if ( n > m )
m = n;
}
return m;
}
そしてそれを次のように呼びます:
list<token> l;
l.push_back( i );
l.push_back( j );
int m = max( l, &token::start_end::start );
ただし、上記のコメントに示されているように、ハードコーディングしたくありませんpos
。、、、start
またはend
のいずれかにアクセスできる柔軟性が必要です。これは、パラメータとしてに渡されます。pos
sent
para
max()
これを機能させるためにいくつかのことを試みましたが(ユニオン、匿名ユニオンなどを使用して試しました)、各値を1回だけ保存しながら、双方向の柔軟性を可能にするデータ構造を思い付くことができません。
私が欲しいものを手に入れることができるように構造体を整理する方法について何かアイデアtoken
はありますか?
明確化を試みる
整数のペアの構造体が与えられた場合、2つの異なる方法でデータを「スライス」できるようにしたいと思います。
- 特定の開始/終了ペアのメンバーへのポインターを渡すことにより、呼び出された関数がどのペアを知らなくても任意のペアで動作するようにします。発信者がどちらのペアを決定します。
int
特定の(つまり、任意のペアの1つのみ )のメンバーへのポインターを渡すことにより、呼び出された関数が、どちらのペアまたはどちらのペアからのものであるかを知らなくても、任意の関数で動作します。呼び出し元は、どちらのペアを決定します。int
int
int
int
int
後者の別の例は、たとえば、すべてpara.end
またはすべてを合計することsent.start
です。
また、重要なのは、上記の#2の場合、発信者の負担を軽減するために、メンバーへのポインターを1つだけ渡すのが理想的です。したがって、私はユニオンを使用して何かを理解しようとしています。
#2の場合、構造体は次のように最適にレイアウトされます。
struct token2 {
int pos_start;
int pos_end;
int sent_start;
int sent_end;
int para_start;
int para_end;
};
秘訣は、何らかの形でtoken
をtoken2
オーバーレイするunion
ことですが、それが実行可能であり、アクセス可能な要件を満たしているかどうか/どのように実行できるかは明らかではありません。