2015-12-28 45 views
-1

我不知道,如果它是可能的,但我想這樣做:使用一類函數的默認參數當對象是參數本身

template <typename T> 
int search(T array, int first = 0, int last = array.size()) 
{ 

} 

這裏T應當是一個容器我想知道它的大小並將其用作默認參數。那可能嗎?

編輯:是的,犯了一個錯誤,它不是T,而是陣列。

+1

'.size()'已被應用到該類型的對象,而不是鍵入名稱本身。 – Barmar

+0

我想你的意思'array.size()'不是'T.size()'。修復後,我認爲你仍然需要一個單獨的過載。我也經常喜歡在那裏使用'array.size()'。但我很確定你不能。 – JSF

+0

@JSF'array.size()'不會起作用 – Slava

回答

7

由於T不是對象,所以不能使用T.size()

您可以使用函數重載來完成您正在嘗試的操作。

template <typename T> 
int search(T const& array, int first, int last) 
{ 
} 

template <typename T> 
int search(T const& array, int first = 0) 
{ 
    return search(array, first, array.size()); 
} 

PS我從T改變所述陣列的類型T const&。這會阻止在調用函數時進行復制。

+0

數組應該作爲const引用傳遞,以避免複製 – Slava

+0

@Slava,好點。 –

+0

爲了適合預期的問題,我認爲它應該通過'&&'(到2輸入過載)然後轉發。 – JSF

0

這是不可能的。相反,你應該替換最後一個默認參數正常參數,並通過容器的大小,而調用該函數,例如,

template <typename T> 
int search(T array, int last, int first=0) 
{ 
    // you can also directly use array.size() here, 
    // so no need for extra parameter 
} 

vector<int> v; 
v.push_back(1); 
v.push_back(2); 

// call search 
search< vector<int> >(v, v.size());