我想要一个结构token
,其中包含位置、句子和段落信息的开始/结束对。我还希望以两种不同的方式访问成员:作为开始/结束对和单独访问。鉴于:
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;
};
我可以编写一个函数,例如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
or&token::para
并且它会做我想做的事。因此,功能是灵活的。
但是,现在我还想编写一个函数,比如说,它计算 all或 all the或 all the等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()
.
我已经尝试了几件事来让它工作(尝试使用联合、匿名联合等),但我无法想出一个数据结构,它允许两种方式的灵活性,同时每个值只存储一次。
任何想法如何组织token
结构以便我可以拥有我想要的东西?
试图澄清
给定整数对结构,我希望能够以两种不同的方式“切片”数据:
- 通过传递一个指向特定开始/结束对的成员的指针,以便被调用的函数在不知道哪对的情况下对任何对进行操作。调用者决定哪一对。
- 通过传递一个指向特定成员的指针
int
(即,任何一int
对中的一个),以便被调用的函数对任何成员进行操作,int
而不知道int
所说int
的来自哪对或哪对。调用者决定哪一int
对。
后者的另一个例子是对 allpara.end
或 all求和sent.start
。
另外,重要的是:对于上面的#2,我理想地希望只传递一个指向成员的指针以减轻调用者的负担。因此,我试图使用工会来解决问题。
对于#2,结构将被优化布局,如:
struct token2 {
int pos_start;
int pos_end;
int sent_start;
int sent_end;
int para_start;
int para_end;
};
诀窍是拥有token
并token2
以某种方式覆盖 a union
,但不清楚是否/如何做到这一点并满足可访问的要求。