如何解决编译时初始化一个非常量变量
问题: 如何在编译时使用函数初始化非常量变量,同时仍然启用对所述函数的运行时调用?
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 举报,一经查实,本站将立刻删除。