2012-08-04 90 views
0

我有一個「靜態」的模板類相似以下:模板類中的'Static'模板類 - 封裝,繼承或...?

#include <cstddef> 

template <size_t elem_size> 
struct StaticClass 
{ 
    static void* priv; 
}; 

所以,該類僅包含靜態成員。如靜態模板所暗示的,每個elem_size應該有一個priv變量。

我也有這已經是從另一個類繼承的主模板類:

template <class T> 
class MainBase 
{ 
    // types, methods... 
}; 

template <class T> 
class MainDerived : public MainBase<T> 
{ 
    // members, methods... 
}; 

現在,我想MainDerived能夠訪問StaticClass<sizeof(T)>;暗示相同大小的不同類型T將訪問相同的變量。 這樣做的最佳方法是什麼?我主要考慮內存佔用。

AFAICS,在MainDerived中有一個非靜態的StaticClass<sizeof(T)>成員,將類大小增加1(對於'靜態'類的大小爲1)。

所以我想任的三種方法:

  1. StaticClass(這是一個多重繼承,然後)繼承,
  2. 定義StaticClass類的靜態成員,
  3. 在訪問StaticClass<sizeof(T)>直接的方法。

這三種方法都將導致一個類似的源代碼(需要的類這樣或那樣的明確規範),他們都不會影響sizeof(MainDerived<T>)。我想知道他們中是否有其他含義我應該知道。

+1

'我想要成員是特定的StaticClass ' - >這是什麼意思? – 2012-08-04 07:20:49

+0

如果兩個'MainDerived'實例使用不同的模板參數'T',但兩個'T'類型的大小相同?那麼即使'T'不同,靜態類也是一樣的。 – 2012-08-04 07:21:53

+0

@Anubis先生,@JoachimPileborg:我編輯了這篇文章,澄清了一點。簡單地說,這意味着每個'elem_size'都有一個變量;對於具有相同大小的不同'T',應該共享該變量。 – 2012-08-04 07:28:54

回答

1

我看到標準庫的string類,它(實際上)具有與所有靜態成員一個輔助類的類型定義的相似性,像

typedef std::char_traits<T> traits_type; 

,然後使用traits_type::copytraits_type::assign等,都通過其餘的代碼。

你可以用你的StaticClass做類似的事情。

typedef StaticClass<sizeof(T)> sc; 

然後用sc::priv來訪問每個類的正確指針。