[英]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.