我有一个模板类,看起来像下面这样:
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>
类,它将池映射作为参数,并返回对poolX_
成员的引用,但我希望避免这样做,因为它似乎不能真正实现静态。谢谢您的阅读!