2012-04-11 11 views
27

Mam pewną klasę C i chcę przekazać adres jej instancji i metody do jakiegoś funktora w funkcji testowej Test_C_Foo1(). Funktor jest klasą szablonów i muszę podać typ metody klasy (MEMFN1) jako jeden z parametrów szablonu. Muszę zdefiniować typ MEMFN1 gdzieś, ale nie chcę zmieniać C.h i nie chcę go zanieczyszczać globalną przestrzenią nazw. Zdecydowałem się zlokalizować typedef tak bardzo, jak to tylko możliwe, więc umieść go wewnątrz funkcji testowej - w zakresie, w którym jest faktycznie używany MEMFN1. Czy używanie metody typedef w treści funkcji jest dobrą praktyką?Czy typedef w treści funkcji jest złą praktyką programowania?

standardowe umożliwia zastosowanie typedef wewnątrz ciała funkcji, ograniczając jedynie w tych szczególnych przypadkach:

typedef specyfikator nie są połączone w dekl-specyfikatora-nast z każdym innym rodzajem specyfikator, z wyjątkiem specyfikatora typu, i nie powinien on być używany w parametrze DekL-specyfikator-seq deklaracji parametru (8.3.5) ani w specyfikacji deklinowania-seq definicji funkcji (8.4).

Oto fragment kodu:

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

To jest po prostu w porządku. – Mat

+0

Faceci, dziękuję za odpowiedzi. Zawężenie zakresu * typedef * w tym przypadku wydawało mi się naturalnym wyborem i miałem wątpliwości tylko dlatego, że nie pamiętałem, czy kiedykolwiek natknąłem się na to w kodzie lub literaturze. –

+0

Czy możesz użyć 'decltype' z C++ 11? –

Odpowiedz

45

To dobry. Jest legalny i zlokalizowany.

+6

To więcej niż dobre: ​​czasami jest * konieczne *. Pomyśl o 'typedef' jako o rodzaju" przypisania zmiennej typu ". –

-4

IMHO, jeśli numer ma na celu uniknięcie wpisania lub spowodowanie, że funkcja wskaźnika do członka stanie się mniej uciążliwa, jak pokazuje twój przykład, to jest w porządku.

Ale jeśli typedef ujawnia jakąś szczególną koncepcję, powinna być widoczna poza funkcją.

Szybki test to sprawdzić to nazwa 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

Mówisz, że jeśli imię coś znaczy, to powinno być globalne? To raczej dziwny punkt widzenia. –

+1

@MikeSeymour - Cóż, to ogólna wytyczna. I nie globalne dokładnie, ale widoczne obok innych koncepcji, które uzupełnia. Na przykład, jeśli typedef "ACTION" ma znaczenie, powinno być zdefiniowane obok klasy 'C'. – rodrigo

+1

dlaczego to zrobić, chłopaki? wszyscy znów obrażają się z filozofii programowania? :) ..jest tam nawet IMHO, i brzmi to warte tego, by tu być, ..IMHO :)) – mlvljr

Powiązane problemy