Lea*_*pcs 2 c++ variadic-functions variadic-templates
这是我的函数的代码:
#include <iostream>
#include <type_traits>
#include <algorithm>
template <typename Head, typename ... Args>
std::common_type_t<Head, Args...> mx(Head n, Args ... args)
{
if (sizeof ... (args) == 0)
return n;
else
return std::max(n, mx(args ...));
}
int main()
{
std::cout << mx(3, 4, 5);
}
Run Code Online (Sandbox Code Playgroud)
我遇到编译错误:
main.cpp:在 'std::common_type_t<Head, Args ...> mx(Head, Args ...) 的实例化中 [with Head = int; 参数 = {}; std::common_type_t<Head, Args ...> = int]': main.cpp:11:24:
从 'std::common_type_t<Head, Args ...> mx(Head, Args ...) 递归地需要[头= int; 参数 = {int}; std::common_type_t<Head, Args ...> = int]' main.cpp:11:24: 需要来自 'std::common_type_t<Head, Args ...> mx(Head, Args ...) [with头=int;参数 = {int, int}; std::common_type_t<Head, Args ...> = int]' main.cpp:16:25:此处需要 main.cpp:11:24:错误:没有匹配的函数可用于调用“mx()”11 | 返回 std::max(n, mx(args ...)); | ~~^~~~~~~~~~ main.cpp:6:35: 注意:候选者: 'template<class Head, class ... Args> std::common_type_t<Head, Args ...> mx(头,参数...)' 6 | std::common_type_t<Head, Args...> mx(Head n, Args ... args) | ^~ main.cpp:6:35: 注意:模板参数推导/替换失败:main.cpp:11:24: 注意:候选者期望至少 1 个参数,0 提供 11 | 返回 std::max(n, mx(args ...)); | ~~^~~~~~~~~~
当然我可以写得更恰当,像这样:
template <typename Head>
std::common_type_t<Head> mx(Head n)
{
return n;
}
template <typename Head, typename ... Args>
std::common_type_t<Head, Args...> mx(Head n, Args ... args)
{
return std::max(n, mx(args ...));
}
Run Code Online (Sandbox Code Playgroud)
但我仍然不明白为什么我的第一个选择不起作用。从错误来看,即使参数包中没有参数,它也会以某种方式尝试调用函数的递归版本。但这对我来说没有任何意义,因为我考虑了这个案例。有什么问题吗?我可以解决它吗?
即使
if (sizeof ... (args) == 0)
Run Code Online (Sandbox Code Playgroud)
整个函数必须是格式良好的 C++。
return std::max(n, mx(args ...));
Run Code Online (Sandbox Code Playgroud)
即使不会被执行,这仍然必须是有效的 C++。如果在模板上下文之外,您有一个if (1),则该else部分仍然必须是有效的 C++,您不能只是在其中扔随机生成的乱码,这是同一件事。当sizeof...(args)为 0 时,函数调用就变成了mx(),当然,没有有效的重载。
相反,您想做的是使用if constexpr而不是普通的if。
if constexpr (sizeof ... (args) == 0)
Run Code Online (Sandbox Code Playgroud)