微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编译时初始化一个非常量变量

如何解决编译时初始化一个非常量变量

问题: 如何在编译时使用函数初始化非常量变量,同时仍然启用对所述函数的运行时调用

详细信息:我使用的是 C++20,我有以下代码

template<typename T>
constexpr auto diag(auto&&.. vals) {...}
// ...
constexpr auto M = diag<double>(1,2,3);

A预期,上面的代码编译通过,diag在编译时执行,M为常量。 如果我将呼叫线路更改为

auto M = diag<double>(1,3);

再次编译代码,但是这一次,diag 是在运行时执行的,并且 M 不是常量。

我想结合以上两者:在编译时执行 diag,但保持 M 可变;基本上是在编译时用一些复杂的东西初始化一个非常量变量,比如 diag 的返回值。

方法:我把代码改成

template<typename T>
consteval auto diag(auto&&.. vals) {...}
// ...
auto M = diag<double>(1,3);

这一次,M 是非常量的,并且在编译时执行 diag,因此有效地实现了我的目标。我的问题是:consteval 必须在编译时执行,所以如果我想在运行时在代码中的其他地方使用 diag,我将不得不编写另一个函数

这就引出了问题: 如何在编译时使用函数初始化非常量变量,同时仍然启用对所述函数的运行时调用

注意: 在上面的示例代码中,diag 创建了一个具有给定条目的对角矩阵。我希望代码等价于

Matrix<double,3,3> M = { {1.0,0.0,0.0},{0.0,2.0,3.0}};

这里,M 不是常量,而是从常量、编译时确定的对角矩阵分配的。

解决方法

您可以使用中间 constexpr 变量:

constexpr auto MInit = diag<double>(1,2,3);
auto M = MInit;

您可以将其包装在 lambda 中:

auto M = [](){ constexpr auto MInit = diag<double>(1,3); return MInit; }();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。