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

C++ 如何为静态常量模板化的专用整数值分配存储,c++,c++17,C++,C++17,我试图创建一个只有头的库,它有一个静态常量值。我需要存储该值,以便使用它,但我不希望创建.cpp文件,因为我尝试只创建库头 如果不可能,则很乐意添加cpp文件,但仍然不知道如何定义变量以便分配存储 下面是这个问题的人为例子。毫不奇怪,它会在未定义的引用上出现链接错误。还尝试了各种组合,如static constexpr size\u t const&value和static constexpr size\u t value,但由于头的多次使用,我在链接时得到了多个定义 模板.h #pragma

我试图创建一个只有头的库,它有一个静态常量值。我需要存储该值,以便使用它,但我不希望创建.cpp文件,因为我尝试只创建库头

如果不可能,则很乐意添加cpp文件,但仍然不知道如何定义变量以便分配存储

下面是这个问题的人为例子。毫不奇怪,它会在未定义的引用上出现链接错误。还尝试了各种组合,如
static constexpr size\u t const&value
static constexpr size\u 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;
};
#pragma一次
#包括
模板
结构数据
{
静态常数size\u t value=sizeof(t)*sizeof(char)+27;
};
模板
结构数据
{
静态常量大小值=9*sizeof(char)+27;
};
模板
结构数据
{
静态常量大小值=18*sizeof(char)+27;
};
main.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;
}
#包括
#包括“template.h”
模板
void printValue()
{

//std::cout您可以将它们全部声明为
constexpr
(而不是
const
):

模板
结构数据
{
静态constexpr size\u t value=sizeof(t)*sizeof(char)+27;
};

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

Ah-默认为C++14-C++17工作-很棒:-)
template<typename T>
struct Data
{
   static constexpr size_t value = sizeof(T) * sizeof(char) + 27;
};