如何为静态常量模板化专用整数值分配存储
How to allocate storage for a static const templated specialized integral value
我正在尝试创建一个具有静态常量值的仅标头库。我需要该值具有存储才能使用它,但我宁愿不创建.cpp文件,因为我尝试仅制作库标头。
如果不可能,那么很高兴添加一个 cpp 文件,但仍然不知道如何定义变量以便分配存储。
下面是问题的人为示例。毫不奇怪,它因未定义的引用上出现链接错误而失败。还尝试了各种组合,例如static constexpr size_t const &value
和static 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
,因此具有存储。您无需执行任何其他操作。
相关文章:
- 如何反转整数参数包
- .cpp和.h文件中的模板专用化声明
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 调用专用模板时出错"no matching function for call to [...]"
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 模板专用化(按容器):value_type
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- C++模板专用化 - 将其他整数类型委托给uint64_t
- 如何根据模板两个整数参数之间的关系对模板进行部分专用化
- 具有整数参数的模板的部分专用化
- 具有两个整数参数的类的部分专用化
- 整数参数特殊值的模板专用化
- 模板类中模板方法的基于整数范围的专用化