Soy muy consciente de los peligros al hacer esto. Por ejemplo:

#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;
}

Mi función tiene una prioridad más baja que la de std::max y produce un error. Quiero saber si hay alguna forma de seguir haciendo referencia a mi función max mientras declaro using namespace std;. No es necesario que me recuerde que no lo declare.

c++
2
Silver Flash 28 ago. 2020 a las 13:24

1 respuesta

La mejor respuesta

Puede invocar su sobrecarga de max particular utilizando el operador de resolución de alcance :: para asegurarse de que se realice una búsqueda de nombre calificado en lugar de una no calificada:

::max(10, 20, 30);

En cuyo caso, la resolución de sobrecarga considerará su propia sobrecarga de función max como una función mejor viable que la de la sobrecarga en el espacio de nombres std. De cppreference - Búsqueda calificada [ énfasis mío] :

Miembros del espacio de nombres

[...]

Búsqueda calificada dentro del alcance de un espacio de nombres N primero considera todas las declaraciones que se encuentran en N y todas las declaraciones que se encuentran en los miembros del espacio de nombres en línea de N (y, de manera transitiva, en sus miembros del espacio de nombres en línea). Si no hay declaraciones en ese conjunto entonces considera las declaraciones en todos los espacios de nombres nombrados por using-directives que se encuentran en N y en todos los espacios de nombres en línea transitivos miembros de N. [...]

6
dfrib 28 ago. 2020 a las 10:33