我正在寫一些時髦的音頻代碼,並嘗試使用運算符重載來創建一個非常乾淨和簡單的API。它變成了一個C++的謎題...「分配到索引」C++操作符重載謎題
我想通過一個「分配到索引」排序的複合運算符立即解決我很肯定不存在。任何人都可以對以下是否有可能有任何見解?
我有2種對象類型....
Frames frames; // audio data, contains 1 buffer (float *) for each channel
Sample s; // a single sample, 1 float for each channel
所以Sample
是一種幀的正交切片,即幀是不是Sample
的陣列。如果您知道音頻,Frames
是「非交錯」,並且Sample
是。
聖盃...
s = frames[1]; // statement 1. gets a copy of values in frame 1
frames[1] = s; // statement 2. replace values in frame 1 with those in Sample s
第一個是沒有問題的:
// in class Frames...
Sample& operator[](size_t idx) const {
Sample s;
s.left = _leftCh[idx];
s.right = _rightCh[idx];
return s;
}
但第二個任務是棘手,因爲上面的函數創建數據的副本,而不是參考。
我試着定義與參考樣本...
class Sample {
public:
float& L;
float& R;
Sample(float& lt, float& rt) : L(lt), R(rt) {};
}
但你不能做的簡單的東西...
Sample s(0.0, 0.0);
s.left = 0.2;
另一個潛在的解決方案是有這兩個語句調用兩個不同的運算符重載。然後執行該語句2調用此[]過載,它返回一個新的框架對象指向值,而不是一個Sample
對象:
Frames& operator[](size_t idx) {
// Construct an new Frames object whose which
// points to value idx in each channel
Frames f(_size - idx);
f._leftCh = &_leftCh[idx];
f._rightCh = &_rightCh[idx];
return f;
}
,然後添加一個賦值操作符來Frames
剛剛替換第一個值...
Frames& operator=(const Sample& s) {
_leftCh[0] = s.left;
_rightCh[0] = s.right;
return *this;
}
編譯器告訴我,方法必須由不僅僅是返回類型更加不同,但這是爲operator[]
重載一個方法名稱後有const
解決。這裏可能有線索嗎?有沒有辦法讓陳述1致電Sample& operator[]...
和陳述2致電Frames& operator[]...
。還是有更好的方法來完成這個?
感謝您的耐心,如果您已經做到了這一點!非常感謝......
第一個** **是一個問題,因爲你是返回一個引用局部變量... – 2013-03-22 09:22:26
第一個是錯誤的:要返回,當你退出該模具的局部變量的引用操作員的範圍。 – juanchopanza 2013-03-22 09:24:14
是的,我也這麼認爲,但是XCode/LLVM在其他情況下不會給我一個警告。這可能是因爲引用立即被複制或可能,因爲我已經定義了內聯方法。似乎很奇怪,但它迄今爲止工作。 – 2013-03-23 18:09:21