我很清楚这样做的陷阱。例如:
#include <iostream>
#include <tuple>
using namespace std;
//a simple function that returns the index of max and max value of a parameter pack
template <typename...T>
tuple<int, int> max(T... args)
{
const int size = sizeof...(args);
int list[size] = {args...};
int max_i = 0;
int max = list[0];
for (int i = 1; i < size; i++)
{
if (list[i] > max)
{
max_i = i;
max = list[i];
}
}
return std::tuple<int, int>{max_i, max};
}
int main()
{
int a ,b;
tie(a, b) = max(10, 20, 30);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的函数的优先级低于 ofstd::max并产生错误。我想知道是否有办法max在声明using namespace std;. 你不用提醒我不要申报。
您可以max使用范围解析运算符调用您的特定重载,::以确保执行限定名称查找而不是非限定名称查找:
::max(10, 20, 30);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,重载决议会将您自己的max函数重载视为比命名空间中的重载更好的可行函数std。来自cppreference - 合格查找[强调我的]:
命名空间成员
[...]
命名空间范围内的限定查找
N首先考虑位于 的N所有声明以及位于 的内联命名空间成员中的所有声明N(并且,传递地,在其内联命名空间成员中)。如果没有声明,在该组则认为通过使用-指令指定的所有空间中声明在发现N和所有传递内嵌命名空间的成员N。[...]