gpt4 book ai didi

c++ - 初始化类模板的static constexpr成员变量

转载 作者:行者123 更新时间:2023-12-02 16:12:51 27 4
gpt4 key购买 nike

情况如下:A类Foo使用模板参数 int N有一个静态成员变量float val . val 的值对应N并且永远不会改变,所以我希望它是 constexpr .

我知道初始化static 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但是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;

但是编译器提示:

error: declaration of constexpr static data member 'val' requires an initializer

如果我为 val 添加一个初始化程序( static constexpr float val { 0.0f }; ),编译器说:

error: duplicate initialization of 'Foo<0>::val'
error: duplicate initialization of 'Foo<1>::val'

多么讽刺:D

我知道的解决方法是使用 variable template (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() };
};

关于c++ - 初始化类模板的static constexpr成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67581506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com