我想要一個結構爲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
或&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
。我希望可以靈活地訪問pos
,sent
或para
中的任何一個的start
或end
,它們將作爲參數傳遞給max()
。
我已經嘗試了幾件事情來讓這個工作(嘗試使用工會,匿名工會等),但我不能拿出一個數據結構,允許兩種方式的靈活性,而每個值只存儲一次。
任何想法如何組織token
結構,所以我可以有我想要的?
在澄清嘗試
由於對整數的結構,我希望能夠以「片」數據以兩種不同的方式:
- 通過傳遞一個指針TO-成員的一個特定的開始/結束對,以便被調用的函數在任何一對上運行而不知道哪一對。來電者決定哪一對。
- 通過傳遞特定
int
的指針到構件(即,僅任何對一個int
),使得被調用的函數的任何int
操作而不需要知道其任一int
或哪對所述int
距離。來電者決定哪一對是哪個int
。
後者的另一個例子是將所有para.end
或全部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
與union
莫名其妙覆蓋,但它並不明顯,如果/如何可以做,但滿足可訪問的要求。
我不確定你在問什麼......你能澄清爲什麼你不能使用標準位置迭代器使用std :: string嗎?使用迭代器,您不需要使用寫入距離函數,可以使用內置的stl算法來計算迭代器之間的距離。 – 2010-04-01 18:19:44
你能否試着重申一下你試圖用簡單的術語解決的問題?我認爲這裏有很多可以幫助你的人,但很難理解你正在努力做什麼。例如,什麼是「職位」?這是在一個文本字符串?起始/結束對是否索引爲一個字符串?謝謝,邁克。 – mikelong 2010-04-01 18:20:33
我認爲他正在尋找一種方法來傳遞一個函數,它將成員拉出來。 – Stephen 2010-04-01 18:30:00