Ответ 1
Это хорошо. Это юридическое и локализованное.
У меня есть класс 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;
}
Это хорошо. Это юридическое и локализованное.
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