簡體   English   中英

部分專門化模板成員功能

[英]Partially specialize template member function

我有一個模板類,如下所示:

template <template <class TypeT> class PoolT=pool_base>
struct pool_map
{
public:
  template <typename U> struct pool { typedef PoolT<U> type };

public:
  template <typename T, size_t S=sizeof(T)>
  T& get( size_t index );

private:
  pool<uint8_t>::type  pool8_;
  pool<uint16_t>::type pool16_;
  pool<uint32_t>::type pool32_;
  pool<uint64_t>::type pool64_;
};

template <template <class TypeT> class PoolT>
template <typename T, size_t S>
inline
T& pool_map<PoolT>::get( size_t index )
{
  // Default case
}

template <template <class TypeT> class PoolT>
template <typename T>
inline
T& pool_map<PoolT>::get<T,8>( size_t index )
{
  // Dispatch to pool8_
}

template <template <class TypeT> class PoolT>
template <typename T>
inline
T& pool_map<PoolT>::get<T,16>( size_t index )
{
  // Dispatch to pool16_
}

template <template <class TypeT> class PoolT>
template <typename T>
inline
T& pool_map<PoolT>::get<T,32>( size_t index )
{
  // Dispatch to pool32_
}

你明顯注意到我在一個美妙而理想的世界中寫下了可能的東西,其中默認的模板參數和模板方法的部分特化是可能的(沒有專門的整個類)。

我想了解建議以達到相同的效果,即能夠為每個大小S設置一個專門的方法,以便我可以選擇適當的池來使用。 我試圖在get_pool<size_t>添加一個get_pool<size_t> ,但幾乎同樣的問題發生了:我不能專門化內部類而不專門化外部類...

我想到的唯一解決方案是使用外部get_pool<size_t>類,它將pool_map作為參數返回對poolX_成員的引用,但我想避免它,因為它似乎不是成為“真正的靜態方式”。

謝謝閱讀!

有一個簡單的解決方案(也許你沒有考慮過),這是:

template <typename T>
T& pool_map<PoolT>::get( size_t index )
{
  if (sizeof(T) * CHAR_BIT == 8) {
     // Dispatch to pool8_
  } else if (sizeof(T) * CHAR_BIT == 16) {
     // Dispatch to pool16_
  } else if (...) {
     ...
  } else {
    // Default case
  }
}

但是,由於這可能會給你編譯錯誤(取決於你所放的而不是“dispatch to ...”)你可以簡單地重載get()函數。

template <typename T>
typename std::enable_if<sizeof(T) * CHAR_BIT == 8,T>::type&
    get( size_t index )
{
   ...
}

template <typename T>
typename std::enable_if<sizeof(T) * CHAR_BIT == 16,T>::type&
    get( size_t index )
{
   ...
}

etc.

唯一的問題是默認實現(如果你需要)需要像sizeof(T) * CHAR_BIT != 8 && sizeof(T) * CHAR_BIT != 16 && sizeof(T) * CHAR_BIT != 32 && sizeof(T) * CHAR_BIT != 64

最后一個解決方案(我說的最好的解決方案)仍然會使用具有靜態功能的私有類,您可以將其專門化(您所說的不是“真正的靜態方式”)

一個解決方案是使用enable_ifdisable_if (通常),雖然我還沒有測試過它。

另一種解決方案是簡單地將實現細節轉發給幫助者:

namespace helper
{
  template <class T> struct getter { static void Do() {} };

  // specializations by type
}

template <class T>
T& pool_map<T>::get(size_t index) { return helper::getter<T>::Do(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM