函数体内部的 typedef 是一种糟糕的编程实践吗?
Is typedef inside of a function body a bad programming practice?
我有一些类C
,想将其实例和方法的地址传递给测试函数Test_C_Foo1()
中的某个函子。函子是一个模板类,我必须提供类方法的类型(MEMFN1
)作为其模板参数之一。我必须在某处定义MEMFN1
类型,但不想更改C.h
,也不想用它污染全局命名空间。我决定尽可能多地本地化 typedef,因此将其放在测试函数中 - 在实际使用 MEMFN1
的范围内。在函数体内使用 typedef 是一种好的做法吗?
标准允许在函数体内使用 typedef,仅在以下特定情况下限制它:
typedef 说明符不得组合在 decl-specifier-seq 中 与除类型说明符以外的任何其他类型的说明符一起使用,并且应 不用于参数声明的 decl-说明符-seq (8.3.5) 也不在函数定义 (8.4) 的 decl-specifier-seq 中。
下面是代码片段:
C.h:
...
#include <string>
...
class C
{
public:
int foo1(const std::string&);
};
主.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;
}
很好。它是合法和本地化的。
恕
我直言,如果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
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在C++编程中继续下一行的另一种方法是什么?
- 如何使用模板元编程在 C++17 中将一种类型转换为另一种类型
- 是c++模板元编程的一种函数编程形式
- 将C++结构写入文件并使用另一种编程语言读取文件
- 函数体内部的 typedef 是一种糟糕的编程实践吗?
- 是否有一种可编程的方法来估计CPU执行fp操作所需的时间
- 在类中广泛使用函数类型定义是一种糟糕的编程实践吗?