2009-05-30 89 views
2

我想寫兩個不同的函數來處理一個常量值和給定類型的變量(即int)。「F(5)」和「int x; F(x)»來調用不同的函數?

這裏是例子測試用例:

int main(void) { 
     int x=12; 
     F(5); // this should print "constant" 
     F(x); // this should print "variable" 
} 

我認爲這將是足夠的定義:

void F(int v) { cout << "constant\n"; } 
void F(int& v) { cout << "variable\n"; } 

這假定編譯器會選擇int&變量爲「更好的專業」和作爲唯一選擇的常數爲int)。然而,G++這是結果:

test.cc: In function ‘int main()’: 
test.cc:13: error: call of overloaded ‘F(int&)’ is ambiguous // for line: F(x); 
test.cc:4: note: candidates are: void F(int) 
test.cc:5: note:     void F(int&) 

G++確實選擇F(int)爲常數,但不知道哪個功能選擇變量。
有沒有人有任何想法,爲什麼會發生這種情況?

背景:我正在用C++中的prolog-like統一方法進行實驗。能夠知道常量和變量之間的差異將有助於我在諸如functor(x,5) <=> functor(3,5)的情況下選擇所需的統一行爲(分配或比較)。

回答

16

如果你想要區分編譯時間常量和非編譯時間常量 - 那麼你就沒有機會了。這是不可能的。

但是,如果你想區分一個非常量變量和一個常量變量(以及其他所有包括文字),那麼你可以用一個const引用和非const引用參數來重載一個函數。對於這種情況,C++標準引入了額外的規則,這使得這種不明確的情況不明確。

void f(int const&); // #1 
void f(int&);  // #2 

在這個問題上,特作如下決定做

int x = 0; 
int const y = x; 
int const z = 1; 

f(1); // #1 
f(x); // #2 
f(y); // #1 
f(z); // #1 

注意怎麼就不能y和z區分,即使的z值是一個編譯時間常數(稱爲整型常量表達式,或者ICE),而y不是。

可以做的只是接受編譯時間值。過載功能,使一個是一個模板,另一種是不

template<int N> void f(); // #1 
void f(int n);   // #2 

它的行爲是這樣,那麼:

int x = 0; 
int const y = x; 
int const z = 1; 

f<1>(); // #1 
f(1); // #2 
f<y>(); // error, y not an ICE 
f<z>(); // #1 
f(x); // #2 
+0

這是我需要的大概是什麼。謝謝。 – liori 2009-05-30 19:10:33

相關問題