我有一个模板类,如下所示:

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使用专门的方法,以便我可以选择合适的池。我试图在pool_map中添加一个get_pool<size_t>,但是发生了几乎相同的问题:如果不专门研究外部类,就不能专门研究内部类...

我想到的唯一解决方案是使用外部get_pool<size_t>类,该类将pool_map作为参数,并返回对poolX_成员的引用,但我想避免使用它,因为它似乎不是“the真正的静态方式”。

谢谢阅读!

最佳答案

有一个简单的解决方案(也许您没有考虑过),它是:

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
  }
}

但是,由于这可能会给您带来编译错误(取决于您放置的内容而不是“分配给...”),因此您可以简单地重载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的条件

最后一种解决方案(我会说最好的解决方案)仍然是使用带有静态函数的私有(private)类,您可以将其专门化(您所说的不是“真正的静态方式”)

关于c++ - 部分专门化模板成员函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3467672/

10-10 02:11