Подтвердить что ты не робот

Является ли typedef внутри тела функции плохой практикой программирования?

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

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

Спецификатор typedef не должен объединяться в spec-specifier-seq с любым другим типом спецификатора, кроме спецификатора типа, и он должен не используется в описании-спецификаторе-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;
}
4b9b3361

Ответ 1

Это хорошо. Это юридическое и локализованное.

Ответ 2

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