[英]Check the value of a variable at compile time / templates
因此,我們有:
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void fun(const T& val)
{
std::cout << "val >= 0";
}
int main()
{
fun(34);
}
假設我們還有其他函數重載。 我如何使上面的函數重載僅在val
的值大於0
時進行編譯?
在http://en.cppreference.com/w/cpp/types/is_integral上,我看到std::is_integral
operator()
重載,並且它返回value
所以我嘗試了以下操作:
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value() > 0>>
當然,它看起來是錯誤的,而且是錯誤的,因為編譯器會很高興地告訴我。
如何在編譯時檢查變量的值?
簡短的回答:不能。
函數輸入參數值在運行時確定。 因此,SFINAE不會對此有所幫助,其他任何編譯時間的技巧也不會。
您可以做的是在運行時解決問題,並定義兩個將相應地引起的獨立功能:
template<typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void fun(const T& val)
{
(val < 0)? lower_than_zero(val) : greater_equal_than_zero(val);
}
但是可能您已經知道了。 如果您仍在進行編譯時評估,並且確定您的變量是編譯時的野獸。 然后,您可以將其作為模板非類型參數傳遞:
template<int N>
std::enable_if_t<N >= 0> fun() {
std::cout << "N >= 0" << std::endl;
}
template<int N>
std::enable_if_t<N < 0> fun() {
std::cout << "N < 0" << std::endl;
}
int main() {
fun<42>();
fun<-42>();
}
正如@ 101010回答的那樣,無法以一般方式執行此操作。 但是,如果您只需要檢查>= 0
一個條件,則可以執行以下操作:
void ff(unsigned int val) {
val = 42;
}
int main()
{
ff(34);
ff(-34);
}
並像這樣編譯:
g++ 1.cpp -Werror -Wsign-conversion
但這只是一個特殊情況的駭客。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.