C++策略类和命名空间
C++ policy classes and namespaces
我已经实现了一个基于策略的类。目前,类模板及其策略类是在名为 utility 的命名空间中声明的。
我面临的问题是生成的代码冗长。客户端代码如下所示:
utility::MyTool<utility::AFirstPolicy, utility::ASecondPolicy>
my_function(utility::MyTool<utility::AnotherFirstPolicy, utility::AnotherSecondPolicy>);
如您所见,可读性不强。我想从以下方面获得一些更接近的东西:
MyTool<AFirstPolicy, ASecondPolicy>
my_function(MyTool<AnotherFirstPolicy, AnotherSecondPolicy>);
我想知道在这种情况下有什么好的做法。这是我能想到的:
类型定义
最明显的解决方案。对我来说不是很方便,因为策略可能因功能而异,并带来了有关功能使用情况的重要信息。我希望它们直接出现在函数原型中。此外,它还在多个命名空间中引入了许多类型名称。
使用指令
在我的文件中放一个using namespace utility;
或using utility::MyTool; using utility::AFirstPolicy;
等。
该工具通常用于其他命名空间的头文件,这使得 using 指令不太合适。
全局命名空间中的策略类
我不喜欢这种方法,特别是因为策略类通常具有模糊的名称,这些名称仅在其上下文中有意义。
宏观
使用某些内容作为
#define MY_TOOL(pcy1, pcy2) utility::MyTool<utility::##pcy1, utility::##pcy2>
将以前的代码转换为
MY_TOOL(AFirstPolicy, ASecondPolicy)
my_function(MY_TOOL(AnotherFirstPolicy, AnotherSecondPolicy));
我不确定这是否更具可读性。它仅适用于固定数量的策略(这是我的情况:始终为 2,没有默认设置(,如果策略类本身采用模板参数,则它不起作用。
您会向我推荐以前的哪种方法?是否有"最佳实践"?另一个想法?
如果你有一个my_function(utility::MyTool<...>)
,那么我会说my_function
属于类模板的接口utility::MyTool<...>
。换句话说,my_function
本身属于namespace utility
。
这意味着您可以以所需的速记形式编写代码:
namespace utility {
typedef MyTool<AFirstPolicy, ASecondPolicy> SomeTool;
my_function(SomeTool);
}
您可以在 Herb Sutter 的旧专栏"What's In a Class"中阅读有关接口和命名空间的更多信息。
请注意,即使您想将其他命名空间中的函数与 namespace utility
中的类一起使用,您仍然可以重新打开该命名空间并在那里定义策略类并执行类似操作
// SomeHeader.hpp
namespace bla {
// your classes and functions
}
// reopen namespace utility
namespace utility {
typedef MyTool<AFirstPolicy, ASecondPolicy> SomeTool;
}
namespace bla {
typedef utility::SomeTool BlaTool; // or using-declaration
my_function(BlaTool);
}
这当然比在实用程序命名空间中定义my_function
更详细,但至少您可以组合所有各种策略而无需太多类型。
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- C++策略类和命名空间