struct Config
{
int version = 1;
};
template<Config& config /* , ... */>
struct Peripheral
{
const Config config_ = config;
static_assert(config_.version > 1, "Config version must be greater than 1");
/* ... */
};
Config myConfig;
int main()
{
myConfig.version = 5;
Peripheral<myConfig> peripheral;
}
我想在編譯時檢查給我的模板的配置是否正確。
所以我試圖將我的參考轉換為一個常量實體,以便嘗試在我的 static_assert 中使用它,但我收到錯誤訊息:'invalid use of non-static data member ...'
在這種情況下,有沒有辦法在編譯時檢查非型別引數的值?或者你有其他的建議來實作這個目標嗎?
uj5u.com熱心網友回復:
如果您希望在編譯時使用 的值,myConfig那么您應該標記它constexpr并直接在初始化程式中給它它的值。無論是靜態還是自動存盤持續時間變數都是次要的:
constexpr Config myConfig = { .version = 5 };
// alternatively before C 20 for example
// constexpr Config myConfig = { 5 };
/*...*/
Peripheral<myConfig> peripheral;
然后模板應該按值而不是按參考來獲取引數,并且您應該直接在以下位置使用該模板引數static_assert:
template<Config config /* , ... */>
struct Peripheral
{
static_assert(config.version > 1, "Config version must be greater than 1");
/* ... */
};
根據其他內容Config或您未使用 C 20 或更高版本,該型別可能不允許作為按值模板引數。在這種情況下,您可以繼續使用參考引數(盡管我不確定這是不是好的設計) ,但您需要const Config&改為匹配const. constexpr在這種情況下,myConfig具有靜態存盤持續時間確實很重要(特別是它可以在命名空間范圍內宣告為static資料成員或自 C 17 以來作為static區域變數)。
如果您想繼續使用本地config_副本進行斷言,則該副本也應該被標記constexpr(const不足以使變數在編譯時可用),因此也必須被標記static(因為static不能宣告非資料成員constexpr) .
模板引數的值static_assert不能(可能)在運行時確定,因此myConfig.version = 5;永遠不會起作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491519.html
上一篇:使用嵌套類作為父類模板引數?
