【发布时间】:2019-04-02 10:50:25
【问题描述】:
我想创建一个 MemoryPool 以在运行时动态分配和取消分配内存,而不涉及操作系统,以尝试加速代码执行(和学习)。为了简化语法,我希望能够将内存段的大小指定为它们包含的类型或原始大小。
为此,我想制作一个模板,它可以采用 Type 或 size_t 并向前发送 sizeof Type 或 size。
template<size_t SegmentSize>
class MemoryPool_Internal
{
public:
static const size_t Size = SegmentSize;
/*Using SegmentSize to do logic*/
};
template<size_t Size>
class MemoryPool : public MemoryPool_Internal<Size> { };
template<class Size>
class MemoryPool : public MemoryPool_Internal<sizeof(Size)> { };
我希望上面的 sn-p 发生的事情是
std::cout << MemoryPool<5>::Size << std::endl;
std::cout << MemoryPool<int>::Size << std::endl;
打印 5 和 sizeof(int)。
但是 5 会引发 C3855,因为它不是类,而 int 会引发 E0254,因为第一个模板中不允许使用类型。 有什么办法可以在编译时解决这个问题到每个预期的模板?
【问题讨论】:
-
您需要一个 C++17 编译器,并使用
auto模板参数。 -
@SamVarshavchik 什么不能解决问题,因为它只接受值
-
模板没有“重载”。
-
对了,为什么不能只使用
size_t变体,在实例化模板时直接显式使用sizeof(int)?