c++ - 初始化类模板的静态 constexpr 成员变量
问题描述
情况如下:Foo
具有模板参数的类int N
有一个静态成员变量float val
。的值val
对应于N
并且永远不会改变,所以我希望它是constexpr
.
我知道初始化静态 constexpr 成员变量的常用方法是:
// ok, but not what I want
template <int N>
struct Foo {
static constexpr float val { 0.0f };
};
template <int N>
constexpr float Foo<N>::val;
但是因为是在类范围内val
初始化的,所以我不能为不同的.val
N
如果val
不是constexpr
but const
,这有效:
// ok, but not what I want
template <int N>
struct Foo {
static const float val;
};
template <>
const float Foo<0>::val = 3.14f;
template <>
const float Foo<1>::val = 0.1f;
但是我不能使用constexpr float val = Foo<0>::val;
,因为Foo<0>::val
它不是一个常量表达式。
所以,我想要实现的目标如下:
// the thing I want, but error
template <int N>
struct Foo {
static constexpr float val;
};
template <>
constexpr float Foo<0>::val = 3.14f;
template <>
constexpr float Foo<1>::val = 0.1f;
但是编译器抱怨:
错误:constexpr 静态数据成员 'val' 的声明需要初始化器
如果我为val
( static constexpr float val { 0.0f };
) 添加一个初始化程序,编译器会说:
错误:'Foo<0>::val' 的
重复初始化错误:'Foo<1>::val' 的重复初始化
多么讽刺:D
我知道的一种解决方法是使用变量模板(C++14):
// ok
struct Foo {
template <int N>
static constexpr float val { 0.0f };
};
template <>
constexpr float Foo::val<0> = 3.14f;
template <>
constexpr float Foo::val<1> = 0.1f;
目前,这按预期工作。但是如果其他成员(变量或函数)Foo
仍然需要模板参数(即Foo
需要是类模板),则此方案不适用。
对此有任何想法吗?首选使用低于 C++20 的 C++ 标准的解决方案(C++20 对我的项目来说太新了)。
解决方案
您可以将类模板专门化为
template <int N>
struct Foo {
static constexpr float val { 0.0f };
};
template <>
struct Foo<0> {
static constexpr float val { 3.14f };
};
template <>
struct Foo<1> {
static constexpr float val { 0.1f };
};
或者为初始化创建一个函数助手。
template <int N>
struct Foo {
static constexpr float get_val() {
if constexpr (N == 0) return 3.14f;
else if constexpr (N == 1) return 0.1f;
else return 0.0f;
}
static constexpr float val { get_val() };
};
推荐阅读
- kotlin - 创建自定义扩展时保留智能广播
- firebase - 在云函数上部署函数错误,错误代码 13 和消息“内部”
- ffmpeg - 加速视频编码
- vue.js - Vuetify 安装问题(未找到这些依赖项:* Vuetify in ./src/main.js)
- android - 如何为 Android Studio 创建“新项目”插件
- javascript - Javascript Array.reduce() 和 Array.find() 的时间复杂度是多少?
- docker - 为什么 Dockerfile 中不使用暴露端口?
- javascript - TypeError:无法读取引导程序中未定义的属性“状态”
- python - 网络摄像头流上的时间叠加
- json - 如何从 django 请求中获取分钟/小时/秒?