我正在尝试编写一个可变参数模板,用于查找任意数量的数字的最大值(这仅用于练习可变参数模板)。
然而,我有点碰壁,无法理解为什么我当前的尝试根本不起作用,并且在编译时因错误而失败:
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);
}
有谁能告诉我如何修复我的可变参数模板?
答案 0 :(得分:11)
只需定义在可变参数函数模板上方有两个参数的重载:
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 :(得分: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);
答案 2 :(得分: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);
}
答案 3 :(得分:0)
使用std::max
previous answer的较短变体,试试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);
}