簡體   English   中英

編譯時初始化一個非常量變量

[英]Compile-time init a NON constant variable

問題:如何在編譯時使用 function 初始化非常量變量,同時仍然啟用對所述 function 的運行時調用?

詳細信息:我正在使用 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,2,3);

代碼再次編譯,但這次 diag 在運行時執行,並且 M 不是常量。

我想將以上兩者結合起來:在編譯時執行 diag,但保持 M 可變; 基本上是在編譯時用一些復雜的東西初始化一個非常量變量,比如 diag 的返回值。

方法:我將代碼更改為

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

這一次,M 是非常量的,而 diag 是在編譯時執行的,所以我的目標有效地實現了。 我的問題是: consteval必須在編譯時執行,所以如果我想在運行時代碼的其他地方使用 diag,我將不得不編寫另一個 function。

這導致了一個問題:如何在編譯時使用 function 初始化非常量變量,同時仍然啟用對所述 function 的運行時調用?

注意:在上面的示例代碼中,diag 創建了一個具有給定條目的對角矩陣。 我希望代碼等效於

Matrix<double, 3, 3> M = { {1.0,0.0,0.0}, {0.0,2.0,0.0}, {0.0,0.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,2,3); return MInit; }();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM