我正在C++中創建一個固定長度的字符串類庫,用於內存有限的設備。我的想法是,我可以聲明像fixed_string < 10>這將導致長度爲11的結構(爲了保留關閉'\ 0'的空間,但是這對用戶是隱藏的)。隱式模板重載
的結構看起來如下:
template<int N> class fixed_string ;
template<>
class fixed_string<0>
{
. . .
}
template<int N>
class fixed_string : public fixed_string<0> {
. . .
}
我試圖適應任何運算符重載在實施< 0>:
template<>
class fixed_string<0>
{
fixed_string & operator+= (const char ch) {
append(ch);
return *this;
}
fixed_string & operator+= (const fixed_string & fs) {
for(char ch : fs)
append(ch);
return *this;
}
}
我可以創建具有以下聲明fixed_length字符串:
fixed_string<20> fs1('e');
fixed_string<10> fs2('d');
而現在我可以做到以下幾點:
fs1 += fs2;
,編譯器會爲我的方法fixed_string<0>::operator+=(fixed_string<0> const&)
它適用於任何fixed_string<N>
所有操作。
我的問題是賦值運算符,因爲它需要一個適當的返回類型:
fixed_string & operator= (const fixed_string & rhs) {
fixed_string::reset();
return *this += rhs;
}
我可以使用顯式鑄造
(fixed_string<0>) fs = (fixed_string<0>) fs2;
調用這個函數,但是這不會是非常人性化。另一種解決方案是:
template<int N>
class fixed_string : public fixed_string<0> {
. . .
template<int M>
fixed_string<N> & operator= (const fixed_string<M> & rhs) {
reset();
return *this += rhs;
}
. . .
}
但這個收益率在無數的功能(由編譯器在模板實例化提供)fixed_string<10>& fixed_string<10>::operator=<20>(fixed_string<20> const&)
,讓我做
fs = fs2;
但我不想有無數的功能。
有什麼辦法可以爲我的庫提供自動轉換功能,所以我沒有無數的assigment-operator函數而沒有強制用戶將每個fixed_string轉換爲fixed_string < 0>?
感謝,
馬丁
我不確定我是否理解你的結構。你怎麼能追加'fixed_string <0>'爲什麼'fixed_string'從它繼承? –
Barry
2014-11-21 15:04:59