簡體   English   中英

在編譯時/模板檢查變量的值

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

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