Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 让模板接受类型或值_C++_Templates_Types - Fatal编程技术网

C++ 让模板接受类型或值

C++ 让模板接受类型或值,c++,templates,types,C++,Templates,Types,我想创建一个MemoryPool,在运行时动态分配和取消分配内存,而不需要操作系统来加速代码执行(和学习)。为了简化语法,我希望能够将内存段的大小指定为它们包含的类型或原始大小 要做到这一点,我想制作一个模板,可以采用类型或大小,并向前发送sizeof类型或大小 模板 类内存池\u内部 { 公众: 静态常数大小=分段大小; /*使用SegmentSize执行逻辑*/ }; 模板 类MemoryPool:PublicMemoryPool_Internal{}; 模板 类MemoryPool:Pub

我想创建一个MemoryPool,在运行时动态分配和取消分配内存,而不需要操作系统来加速代码执行(和学习)。为了简化语法,我希望能够将内存段的大小指定为它们包含的类型或原始大小

要做到这一点,我想制作一个模板,可以采用类型或大小,并向前发送sizeof类型或大小

模板
类内存池\u内部
{
公众:
静态常数大小=分段大小;
/*使用SegmentSize执行逻辑*/
};
模板
类MemoryPool:PublicMemoryPool_Internal{};
模板
类MemoryPool:PublicMemoryPool_Internal{};
对于上面的代码片段,我想做的是


std::cout你不能这样做。这种语言不允许这种语法。但是,您可以只使用类型模板并创建一个类型来保存显式大小:

template <std::size_t SegmentSize>
struct ExplicitSize
{
    static constexpr auto Size = SegmentSize;
};

template <class T>
constexpr std::size_t SegmentSize = sizeof(T);
template <std::size_t Size>
constexpr std::size_t SegmentSize<ExplicitSize<Size>> = Size;


template<class SizeSpecifier>
class MemoryPool_Internal
{
public:
    static const size_t Size = SegmentSize<SizeSpecifier>;
    /*Using Size to do logic*/
};

static_assert(MemoryPool_Internal<ExplicitSize<32>>::Size == 32);
static_assert(MemoryPool_Internal<int>::Size == sizeof(int));

您的问题源于尝试对两个不同的模板类使用相同的名称

我认为,为不同类型的内存池使用不同的名称是这里唯一的解决方案(在我看来,在以后阅读代码时不那么模棱两可):

模板
类内存池\u内部
{
公众:
静态常量大小\u t大小=大小;
/*使用SegmentSize执行逻辑*/
};
模板
类SizedMemoryPool:public MemoryPool_Internal{};
模板<类型名称类型>
类TypedMemoryPool:public MemoryPool_Internal{};

上述方法对我有效-分别为测试输出5和4。

您需要一个C++17编译器,并使用
auto
模板参数。@SamVarshavchik什么不能解决问题,因为它只接受值没有“重载”对于模板。是否可以使用enable_if’s或其他一些编译时stl条件做一些魔术呢?顺便问一下,为什么不能使用
size_t
变量,并在实例化模板时直接显式使用
sizeof(int)
?这既简洁又简单,很可能就是我最后要做的。但是,在尝试使用该类时,它会产生一些歧义。
MemoryPool_Internal<32>
MemoryPool_Internal<sizeof(int)>
template< size_t SIZE >
class MemoryPool_Internal
{
public:
    static const size_t Size = SIZE;
    /*Using SegmentSize to do logic*/
};

template< size_t SIZE >
class SizedMemoryPool : public MemoryPool_Internal< SIZE > { };

template< typename TYPE >
class TypedMemoryPool : public MemoryPool_Internal< sizeof( TYPE )> { };