2012-04-11 2 views
27

У меня есть класс C и вы хотите передать адрес его экземпляра и метода некоторому функтору в тестовой функции Test_C_Foo1(). Functor - это класс шаблона, и я должен указать тип метода класса (MEMFN1) как один из его параметров шаблона. Я должен определить тип MEMFN1 где-нибудь, но не хочу изменять C.h и не хочу загрязнять им глобальное пространство имен. Я решил локализовать typedef как можно больше, поэтому поставьте его внутри тестовой функции - в пределах области, где фактически используется MEMFN1. Является ли использование typedef внутри тела функции хорошей практикой?Является ли typedef внутри тела функции плохой практикой программирования?

Стандарт позволяет использовать ЬурейеЕ внутри тела функции, ограничивая его только в этих конкретных случаях:

ЬурейеЕ спецификатор не должны быть объединены в ДЕЦЛ спецификатора-сл с любым другим видом спецификатор, за исключением спецификатора типа, и он должен не использовать в описании-спецификаторе-seq объявления-параметра (8.3.5) или в определении-спецификаторе-seq определения функции (8.4).

Вот фрагмент кода:

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

Это просто прекрасно. – Mat

+0

Ребята, спасибо за ваши ответы. Сужение сферы * typedef * в этом случае показалось мне естественным выбором, и я сомневался только в том, что не мог вспомнить, встречался ли я когда-либо в коде или литературе. –

+0

Не могли бы вы использовать 'decltype' с C++ 11? –

ответ

45

Это хорошо. Это законно и локально.

+6

Это более чем полезно: иногда * необходимо *. Подумайте о 'typedef' как о« назначении переменной типа ». –

-4

IMHO, если typedef - это просто, чтобы избежать ввода или сделать функцию указателя на член менее громоздкой, как показывает ваш пример, тогда это нормально.

Но если typedef раскрывает определенную концепцию, то она должна быть видимой вне функции.

Быстрый тест, чтобы проверить это имя 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

Вы говорите, что если имя что-то означает, то оно должно быть глобальным? Это довольно странная точка зрения. –

+1

@MikeSeymour - Ну, это общая рекомендация. И не глобально точно, но видно рядом с другими концепциями, которые он дополняет. Например, если значение 'ACTION' было значимым, оно должно быть определено рядом с классом' C'. – rodrigo

+1

Зачем снижать это, парни? все снова оскорблены философией программирования? :) ..там есть ИМХО, и это звучит стоит здесь, .. ИМХО :)) – mlvljr

Смежные вопросы