En C ++, ¿se puede cambiar el nombre / alias de un nombre que no sea de espacio de nombres ni de clase?

He

namespace src {
   struct src_bar;
   void src_baz();
   template<class T> class src_qux;
}

al que me gustaría hacer referencia como

namespace dst {
    struct dst_bar;
    void dst_baz();
    template<class T> class dst_qux;
}

lo que significa que me gustaría "cambiar el nombre" o "alias" o "volver a etiquetar" los nombres de src.

Para dst_bar uno puede, por supuesto, usar namespace dst { typedef src_bar dst_bar; }. ¿Hay algún equivalente (no macro) que me permita cambiar el nombre? src::src_baz as dst::dst_baz y la src::src_qux as dst::dst_qux?

A menos que me equivoque, ni un using declaración ni un alias de espacio de nombres pueden lograr los otros dos. Escribir funciones de reenvío con plantilla para dst_baz() es una posibilidad, pero requiere el conocimiento de la aridad de src_baz. La plantilla typedefs podría tener dst_qux<T>::type be src_qux<T> pero la indirección agrega verbosidad.

FWIW, mi caso de uso está tomando nombres C como somepackage_someportion_somefuncA y proporcionando una versión amigable con el espacio de nombres somepackage::someportion::somefuncA para que otras personas puedan emplear using somepackage::someportion para ser breve.

preguntado el 01 de febrero de 12 a las 04:02

Is #define opción viable para ti? -

3 Respuestas

Para las funciones, tendrá que reenviar manualmente las solicitudes. Para los tipos que no son de plantilla, simplemente puede escribir def. Para los tipos de plantilla, puede usar el nuevo using característica de c ++ 11 Para crear un alias de estilo typedef para una plantilla, si su compilador lo admite, o si no, básicamente no tiene suerte.

Respondido 01 Feb 12, 08:02

Esto es lo que esperaba. Gracias por confirmarlo. - Rhys Ulerich

No, no puede "cambiar el nombre" de algo para que ya no use su nombre original.

Sin embargo, puede obtener el mismo efecto mediante engaños.

Primero, importe el encabezado de las definiciones que desea acorralar dentro de un bloque de espacio de nombres:

namespace foo {
    #include "src_stuff.h"
}

Ahora tu tienes foo::src::src_bar y amigos.

Luego, use typedef liberalmente:

namespace bar {
    typedef foo::src::src_bar dst_bar;
}

Voila, tienes un bar::dst_bar que es lo mismo que src::src_bar habría sido. Si no le importa que las definiciones permanezcan disponibles bajo los nombres antiguos además, omita el primer paso y simplemente haga typedefs por conveniencia. Después de todo, para eso están.

Respondido 01 Feb 12, 08:02

Incluir el archivo incluido en un espacio de nombres seguramente será problemático ... El archivo de implementación para ese encabezado no tendrá el espacio de nombres y, por lo tanto, definirá funciones diferentes a las declaradas en el encabezado así incluido. Y esto no aborda la parte principal de la pregunta: cómo hacer el equivalente de typedefs para funciones y plantillas. - David Rodríguez - dribeas

@ DavidRodríguez-dribeas Las plantillas no interfieren en la typedef Acercarse. Incluso puede utilizar macros de preprocesador si son demasiado largas. - Borealido

Si el uso de macros es una opción aceptable para usted, aquí tiene una solución:

// declare this macro in some common file
#define CREATE(SCOPE) \
namespace SCOPE { \
   struct SCOPE## _bar; \
   void SCOPE## _baz(); \
   template<class T> class SCOPE## _qux; \
}

Uso:

CREATE(src);
CREATE(dst);

Respondido 01 Feb 12, 08:02

Gracias por la solución basada en macros. - Rhys Ulerich

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.