2012-12-20 87 views
2

我試圖通過使用Lambda或轉發參數一些如何但它甚至不編譯來擺脫重載函數。爲什麼我不能這樣做?還有什麼替代方法?variadic模板中的lambda函數

我真的不想使用超載功能。我知道我在做什麼是錯誤的,但必須有一種方式?

int maximum(int n) //Trying to not have to use this.. I want to get rid of this :l 
{ 
    return n; 
} 


template<typename... Args> 
int maximum(int n, Args... args) 
{ 
    return std::max(n, [&args...](int n){return n;}); //tried using a lambda instead of maximum(args...); 
} 

我也試過:

template<typename... Args> 
int maximum(int n, Args... args) 
{ 
    return std::max(n, std::forward<Args>(args)...); 
} 

而且,爲什麼(不編譯):

template<typename... Args> 
int maximum(int n, Args... args) 
{ 
    return std::max(n, []{return 0;}); 
} 

不同(編譯):

template<typename... Args> 
int maximum(int n, Args... args) 
{ 
    return std::max(n, 0); 
} 

第一不會編譯,但第二個肯定會..:S

我使用所有的上面,如:std::cout<<maximum(1, 2, 3, 7, 2, 5);

+0

所有其他的事情都是平等的,最後兩個片段之間的最終區別是'[] {return 0; }'和'0'。你能理解這兩者之間的區別嗎? –

回答

2

以下工作:

template<typename... Args> 
int maximum(Args&&... args) 
{ 
    return std::max({std::forward<Args>(args)...}); 
} 

int main() 
{ 
    std::cout << maximum(1, 2, 3, 4, 5); 
} 
+0

哇..從來沒有想過我會看到一個解決方案。你能告訴我爲什麼這有效嗎?另外,爲什麼它只能在空洞和前鋒周圍的花括號裏工作? 它似乎也沒有void()..但爲什麼? – Brandon

+1

@CantChooseUsernames:謝謝你讓我知道,似乎你需要的只是花括號。大括號是需要的,因爲[std :: max](http://en.cppreference.com/w/cpp/algorithm/max)需要一個'std :: initializer_list '。 –

+0

Omg .. Ahahaha我一直在嘗試超過一個小時,並沒有意識到它只是花括號。豎起大拇指給你先生。大聲笑我發現你的評論後不禁大笑。 – Brandon

1

如何跳過拉姆達,只是寫:

template <typename T> 
const T& maximum (const T& t) { return t; } 

template <typename T, typename... Args> 
const T& maximum (const T& t, Args... args) { 
    return std::max (t, maximum (std::forward<Args>(args)...)); 
    } 
+0

因爲我試圖擺脫最大限度的調用,就像你爲std :: max參數所做的那樣。我不想寫第一個函數,也就是返回t的函數。 – Brandon