簡體   English   中英

重載函數調用編譯時常量

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

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