c++ - relacionales - Sobrecarga de operador unario y
sobrecarga de operadores unarios c++ (6)
¿Hay alguna sintaxis para pasar la dirección de
a
af
?
Sí, hay una sintaxis fea:
f( reinterpret_cast<A*>( &reinterpret_cast<char&>(a) ) );
boost::addressof
es un envoltorio agradable y genérico a su alrededor.
Consideremos una clase con operador unario sobrecargado y (Dirección de). Que sea class A
template <class C>
class A
{
public:
C * operator &()
{
return &data;
}
//...
private:
C data;
}
Ahora quiero pasar a alguna función un puntero de tipo A
para rellenar sus data
. Llamémoslo f
void f(A * auto_containter)
{
//...
}
Pero está claro por qué el siguiente código no funcionaría (ni siquiera compilaría). Es porque se llama al operador sobrecargado.
A a;
f(&a);
La pregunta es la siguiente:
¿Hay alguna sintaxis para pasar la dirección de a
a f
? Si no, entonces para mí es muy extraño por qué se permite sobrecargar a un operator &
único, ya que hace que el código sea más defectuoso y difícil de entender. ¿O hay otras razones?
¿Hay alguna sintaxis para pasar la dirección de a a f?
Otros ya han señalado boost::addressof
. El mecanismo en el que se basa es un uso estándar garantizado del operador de dirección incorporado para un reinterpret_cast
al tipo de referencia. La función Boost simplemente envuelve la combinación más bien verbosa y torpe de moldes.
Si no, entonces para mí es muy extraño por qué se permite sobrecargar a un operador único, y porque hará que el código sea más defectuoso y difícil de entender. ¿O hay otras razones?
En algunos casos puede ser más conveniente. Por ejemplo, una clase de puntero inteligente podría ofrecer un operador de dirección personalizado para admitir la escritura &p
como argumento real a un argumento formal T**
. Sin embargo, creo que hoy en día se reconoce generalmente que no es tan buena idea.
Salud y salud,
¿Por qué querrías sobrecargar al operator&
único operator&
?
Aparte de eso, hay boost::addressof
.
Por eso se inventó boost::addressof
.
Tu escenario nunca se presenta, porque cualquiera que esté escribiendo esa función tomará una referencia, no un puntero. Además, olvidó crear una instancia de A con un tipo de ejemplo para C.
Utilice boost::addressof
function. En cualquier caso, la sobrecarga unaria y es muy dudosa. ¿Por qué hacerlo en lugar de tener una función con nombre que devuelva la dirección de sus datos?