2012-04-11 13 views
27

Tengo alguna clase C y quiero pasar la dirección de su instancia y método a algún functor en una función de prueba Test_C_Foo1(). Functor es una clase de plantilla y tengo que proporcionar el tipo del método de clase (MEMFN1) como uno de sus parámetros de plantilla. Tengo que definir MEMFN1 escriba en algún lugar pero no quiero cambiar C.h y no quiero contaminar el espacio de nombres global con él. Decidí localizar typedef tanto como sea posible, así que colóquelo dentro de una función de prueba, dentro del alcance donde realmente se usa MEMFN1. ¿Es bueno usar un typedef dentro del cuerpo de la función?¿El typedef dentro de un cuerpo de función es una mala práctica de programación?

estándar permite el uso de typedef el interior de un cuerpo de la función, la restricción de que sólo en estos casos particulares:

El especificador typedef no se puede combinar en una decl-especificador-ss con cualquier otro tipo de especificador, excepto un especificador de tipo, y no deberá utilizarse en el especificador-declinal-seq de una declaración de parámetro (8.3.5) ni en el especificador de declinación-seq de una definición de función (8.4).

He aquí el fragmento de código:

C.h:

... 
#include <string> 
... 

class C 
{ 
public: 
    int foo1(const std::string&);  
}; 

main.cpp:

... 
#include "C.h" 
... 

void Test_C_Foo1() 
{ 
    typedef int(C::*MEMFN1)(const std::string&); 

    C c; 
    Functor1<C, MEMFN1,...> f1(&c, &C1::foo1,...); 
    ... 
} 

... 

int main() 
{ 
    Test_C_Foo1(); 
    return 0; 
} 
+1

Es muy bien. – Mat

+0

Chicos, gracias por sus respuestas. Reducir el alcance de * typedef * en este caso me pareció una elección natural y tenía dudas solo porque no podía recordar si alguna vez lo había encontrado en el código o la literatura. –

+0

¿Podría usar 'decltype' con C++ 11? –

Respuesta

45

Es buena . Es legal y localizado.

+6

Es más que bueno: a veces es * necesario *. Piense en 'typedef' como un tipo de" asignación variable de tipo ". –

-4

En mi humilde opinión, si el typedef es sólo para evitar escribir o para hacer que la función del puntero al miembro sea menos engorrosa, como muestra su ejemplo, entonces está bien.

Pero si el typedef revela algún concepto particular, entonces debería ser visible fuera de la función.

Una prueba rápida para comprobar que es el nombre de la typedef:

typedef int(C::*MEMFN1)(const std::string&); //OK: as local typedef, just an abbreviation 

typedef int(C::*ACTION)(const std::string&); //Not so OK: Action is a new concept 
+7

¿Estás diciendo que si un nombre significa algo, entonces debería ser global? Ese es un punto de vista bastante extraño. –

+1

@MikeSeymour - Bueno, esa es una guía general. Y no global exactamente, pero visible al lado de los otros conceptos que complementa. Por ejemplo, si el tipo de letra 'ACTION' era significativo, debería definirse al lado de la clase' C'. – rodrigo

+1

¿por qué downvote esto, grietas? todos ofendieron por la filosofía de la programación, otra vez? :) ..incluso hay un mixto en mi humilde opinión, y esto vale la pena estar aquí, ..IMHO :)) – mlvljr

Cuestiones relacionadas