gpt4 book ai didi

c++ - 部分特化模板成员函数

转载 作者:太空狗 更新时间:2023-10-29 21:30:04 25 4
gpt4 key购买 nike

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

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>在 pool_map 内部,但几乎同样的问题发生了:我无法在不专门化外部类的情况下专门化内部类...

我想到的唯一解决方案是使用外部 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
}
}

但由于这可能会给您带来编译错误(取决于您输入的内容而不是“发送到...”),您可以简单地重载 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com