2012-01-14 49 views
2

我想寫一個可變模板來找到最大的任意數量的數字(這只是爲了練習可變模板)。Variadic模板最大功能麻煩

不過,我已經有點碰了壁,不能明白爲什麼我當前的嘗試根本不起作用,而且在編譯時有錯誤失敗:

prog.cpp: In function 'A myMax(A, A, Args ...) [with A = int, Args = {}]': 
prog.cpp:7:35: instantiated from 'A myMax(A, A, Args ...) [with A = int, Args = {int}]' 
prog.cpp:22:26: instantiated from here 
prog.cpp:7:35: error: no matching function for call to 'myMax(int)' 

我的代碼如下:

#include <iostream> 

template <typename A, typename ... Args> 
A myMax(A a, A b, Args ... args) 
{ 
    return myMax(myMax(a,b),args...); 
} 

template <typename A> 
A myMax(A a,A b) 
{ 
    if (a>b) 
     return a; 
    else 
     return b; 
} 


int main() 
{ 
    std::cout<<myMax(1,5,2); 
} 

誰能告訴我如何修復我的variadic模板?

+6

OK,但是一旦你完成學習,請進入返回並使用'std :: max' :-) – 2012-01-14 04:52:32

回答

10

只要定義它接受可變參數函數模板上面的兩個參數的過載:

template <typename A> 
A myMax(A a,A b)  //this is an overload, not specialization 
{ 
    if (a>b) 
     return a; 
    else 
     return b; 
} 

template <typename A, typename ... Args> 
A myMax(A a, A b, Args ... args) 
{ 
    return myMax(myMax(a,b),args...); 
} 

現在,它的工作:http://www.ideone.com/R9m61

過載應在實例化的角度來看,這是在可見可變參數函數模板。

1

使用constexpr,現在可以做一些類似如下:

template<typename num_t, num_t ...X> 
constexpr num_t max_element(){ 
    const std::array<num_t, sizeof...(X)> vals{X...}; 
    num_t ret = 0; 
    for(size_t i=0; i<sizeof...(X); i++) 
     if(vals[i] > ret) 
      ret = vals[i]; 
    return ret; 
} 

我試着往前一步,使用簡單:

const std::array<num_t, sizeof...(X)> vals{X...}; 
return *std::max_element(vals.cbegin(), vals.cend()); 

但編譯器抱怨(我忘了究竟[編輯:查看this question/answer更多一般地解釋了std :: alogrithm的情況。]

無論如何,你使用它只是爲:

auto max_val = max_element<int, 11, 88, 12, 2>(); 
assert(max_val == 88); 
1
template<class T> 
T Max(T a, T b) 
{ 
    return (a > b ? a : b); 
} 

template<class T, class... a> 
T Max(T x , a... z) 
{ 
    T k = Max(z...); 
    return (x > k ? x : k); 
} 

int main() 
{ 
    cout << Max(14,45,87,66,99,888,554,21); 
} 
0

使用std::maxprevious answer的短variaton,試試吧here

#include <iostream> 

template <typename T> 
T Max(T a) 
{ 
    return a; 
} 

template <typename T, typename ... Args> 
T Max(T a, Args ... args) 
{ 
    return std::max(Max(args...), a); 
} 

int main() { 
    std::cout << Max(14,45,87,66,99,888,554,21); 
} 
+1

不要說「高於」,因爲您無法確定將要採用哪種順序來回答問題,或者哪些答案將保持未刪除狀態。而是通過下面的共享鏈接鏈接到答案。 – 2017-05-12 21:49:39