可变模板最大函数故障
Variadic template max function trouble
我正在尝试编写一个可变模板,用于查找任意数量的数字的最大值(这只是为了练习可变模板)。
然而,我有点碰壁了,不明白为什么我目前的尝试根本不起作用,在编译时失败了,并出现了错误:
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);
}
有人能告诉我如何修复我的变体模板吗?
只需定义重载,该重载接受变量函数模板之上的两个参数:
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
重载应该在实例化时可见,实例化在可变函数模板中。
使用std::max
的上一个答案的较短变量,请在此处尝试:
#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);
}
使用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());
但编译器抱怨道(我完全忘记了它说了什么。[编辑:请参阅这个问题/答案,它更普遍地解释了std::alogorithm的情况。]
不管怎样,您可以简单地将其用作:
auto max_val = max_element<int, 11, 88, 12, 2>();
assert(max_val == 88);
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);
}
没有额外二进制过载的解决方案:
template <typename... Ts>
auto Max(Ts... ts)
{
auto a = (ts,...);
auto max = [&](const auto& b)
{
return a = std::max(a, b);
};
return ((max(ts)), ...);
}
int main() {
std::cout << Max(11,4,87,2,99);
return 0;
}
相关文章:
- C++函数过载会导致 SEG 故障
- 分段故障 11,从类函数显示动态 C 字符串
- 如何传播 NodeJS 包装C++代码的函数故障?
- std :: unordered_map分段构造函数中的故障
- C++中的累积函数故障无法找到平均值
- 分割故障(核心倾倒) - 材料函数
- 在调用函数中指定指针时进行分割故障
- OPENCV 3.3-使用GPU函数时分割故障
- 为什么最后一个拆分函数会导致分割故障?如何解决此问题
- 带指针的调用函数会导致段故障
- 递归函数上的分割故障C
- C 单链接列表复制构造函数分割故障
- 从新位置调用函数时C 细分故障
- 崩溃:分段故障:增强序列化加载 - 用null调用构造函数
- C 查找无SQRT函数循环故障的平方根
- std::map 的比较器函数中的 SEG 故障/未定义行为
- 函数仅在按Enter或到达文件末尾时才会导致分割故障
- 未解析的外部符号突然出现.构造函数故障
- C++0x λ + 提升::函数故障
- 可变模板最大函数故障