0

我正在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>?

感謝,

馬丁

+0

我不確定我是否理解你的結構。你怎麼能追加'fixed_string <0>'爲什麼'fixed_string '從它繼承? – Barry 2014-11-21 15:04:59

回答

0

忽略你的奇怪的設計(而不是從零長度字符串繼承,爲什麼不創建一個普通類,稱之爲fixed_string_base,並把所有的功能[和可能的變數?]有),你可以提供用戶自定義轉換 - !http://en.cppreference.com/w/cpp/language/cast_operator

template<int N> 
class fixed_string : public fixed_string<0> { 
    ... 
    operator fixed_string<0>() const 
    { 
     ... 
    } 
    ... 
} 

你也可以提供賦值運算符中有N類= 0,「內部」這些功能只能做演員 - 編譯WOU ld內聯(如果啓用優化),問題也會解決。

+0

您提供的解決方案不起作用 - 編譯器無法在專用<0>中找到轉換運算符,如實施 另外 - 如果我在N!= 0類中提供了賦值運算符,則它將生成很多功能,或者它會提供一個類似於分配的操作符。 – martinBrothers 2014-11-21 15:22:18

+0

在N!= 0類中賦值運算符的技巧是使其成爲_inline_。你不能「手工」修復所有的東西,但是如果函數是「簡單的」,那麼你可以確信編譯器會優化(內聯)它 - 但是爲了確保這一點,只能有一個簡單的操作來調用一些通用(非模板化)功能。這就是應該使用模板的原因 - 很多STL代碼都是這樣完成的 - 有一個公共的,非模板化的類(比如「list_base」),用於公共API(比如「std :: list」) – 2014-11-21 15:34:17