[英]Overloading function calls for compile-time constants
我有興趣知道是否可以使用編譯時常量提供的參數和沒有編譯時常量的參數來區分函數調用?
例如:
int a = 2;
foo( a ) // #1: Compute at run-time
foo( 3 ) // #2: Compute at compile-time
有沒有辦法提供區分這兩種情況的重載? 或者更一般地說,我如何檢測文字類型的使用?
我查看了constexpr,但函數參數不能是constexpr。 擁有相同的調用語法會很巧妙,但能夠根據文字類型的參數生成不同的代碼。
您無法區分編譯時文字int
和運行時變量int
。 如果需要這樣做,可以提供只能在編譯時工作的重載:
void foo(int ); // run-time
template <int I>
void foo(std::integral_constant<int, I> ); // compile-time
我認為上述答案不知何故錯過了這個問題試圖提出的觀點。
有沒有辦法提供區分這兩種情況的重載? 或者更一般地說,我如何檢測文字類型的使用?
這就是'右值參考'的用途。 文字類型是右值。
擁有相同的調用語法會很巧妙,但能夠根據文字類型的參數生成不同的代碼。
你可以簡單地重載你的foo()函數:
void foo(int&& a);
因此,當您使用文字調用函數時,例如foo(3),編譯器知道您需要上面的重載,因為3是一個右值。 如果將函數調用為foo(a),編譯器將獲取原始版本foo(const int& a);
as int a=2;
是一個左值。
這為您提供了相同的調用語法。
在一般情況下,你無法在編譯時得到foo(3)。 如果將foo(x)定義為當前日期添加x天 - 並且您下周二首次運行該程序,該怎么辦? 如果它確實是常數,那么使用符號常量。 如果它是一個簡單的函數,你可以嘗試一個define(它將在編譯時用實現替換 - 但它仍將在運行時進行評估)
例如
#define MIN(x,y) ((x)<(y)?(x):(y))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.