簡體   English   中英

在 class 中使用 static_assert - 怎么樣?

[英]using static_assert in a class - how?

我試圖簡化在編譯時檢查一個值到新類型的轉換是否保留了該值。 STL 里面可能有東西可以幫我做這個,但是我沒有看到,所以我寫了一個。 它可以工作,但我想將其轉換為 class 以便其他人使用更簡單。 我無法讓它發揮作用,我覺得我錯過了一些明顯的東西。

這工作正常:

    template <typename T, typename Q>
    constexpr bool checkV(const Q x) 
    {return x == (T)x && ((x < 0) == ((T)x < 0));}

    static_assert(checkV<unsigned int>(-7), "No");

但是這個電話很笨拙,所以我想要更像

    CheckIt<unsigned int>(-7)

所以我嘗試了

    template<typename T>
    class CheckIt {public:
      template<typename Q>
      constexpr CheckIt(const Q x) {static_assert(checkV<T>(x), "No");}
};

我嘗試了 const 和 constexpr 的各種組合(發現參數不能是 constexpr,這很煩人)。 我嘗試的所有結果都會導致 g++ 抱怨 x 不是構造函數中的常量表達式。

我錯過了什么? checkv 和構造函數都始終使用常量調用,例如 -7。 checkv() 很樂意在編譯時進行評估,我看不出在哪里使用構造函數 function 進行包裝,這給編譯器增加了任何額外的負擔,但顯然確實如此。 注意我需要這個在 C++11 中工作,但我看不出以后的版本在哪里會有幫助。 我在運行時使用斷言檢查沒有問題,但我想要常量的編譯時解決方案。 TIA。

將變量傳遞給 function 將不起作用,因為它不是常量表達式,因此 static_assert 不會接受它。

您可以嘗試將該值作為模板參數傳遞。

template <typename T, typename Q>
constexpr bool checkV(const Q x)
{
    return x == static_cast<T>(x) && ((x < 0) == (static_cast<T>(x) < 0));
}

template <typename T, typename Q, Q N>
void CheckIt() {
    static_assert(checkV<T, Q>(N));
}


int main() {
    constexpr auto val = -7;
    CheckIt<unsigned int, decltype(val), val>();
}

但它並沒有更干凈。

編輯:您也可以使用“好”的舊宏

#define CheckIt(x,y) static_assert(checkV<x, decltype(y)>(y));

int main() {
    CheckIt(unsigned int, -7);
}

暫無
暫無

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

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