如何为静态常量模板化专用整数值分配存储

How to allocate storage for a static const templated specialized integral value

本文关键字:整数 专用 分配 存储 静态 常量      更新时间:2023-10-16

我正在尝试创建一个具有静态常量值的仅标头库。我需要该值具有存储才能使用它,但我宁愿不创建.cpp文件,因为我尝试仅制作库标头。

如果不可能,那么很高兴添加一个 cpp 文件,但仍然不知道如何定义变量以便分配存储。

下面是问题的人为示例。毫不奇怪,它因未定义的引用上出现链接错误而失败。还尝试了各种组合,例如static constexpr size_t const &valuestatic constexpr size_t value但是由于标题的多次使用,我在链接时获得了多个定义

模板.h

#pragma once
#include <cstdint>
template<typename T>
struct Data
{
static const size_t value = sizeof(T) * sizeof(char) + 27;
};
template<>
struct Data<int32_t>
{
static const size_t value = 9 * sizeof(char) + 27;
};
template<>
struct Data<int64_t>
{
static const size_t value = 18 * sizeof(char) + 27;
};

主.cpp

#include <iostream>
#include "template.h"
template<typename T>
void printValue()
{
// std::cout << "value min=" << std::min(Data<T>::value, 4ul) << std::endl;
std::cout << "value addr=" << &Data<T>::value << std::endl;
}
int main(int argc, char *argv[])
{
printValue<int32_t>(); 
printValue<int64_t>(); 
printValue<char>(); 
return 0;
}

使用 gcc-9.2

你把它们都声明constexpr(而不是const(:

template<typename T>
struct Data
{
static constexpr size_t value = sizeof(T) * sizeof(char) + 27;
};

在C++17中,static constexpr数据成员被隐式inline,因此具有存储。您无需执行任何其他操作。