C++ 策略类和命名空间

标签 c++ macros namespaces using policy

我实现了一个基于策略的类。目前,类模板及其策略类在名为 utility 的命名空间中声明。

我面临的问题是生成的代码冗长。客户端代码如下所示:

utility::MyTool<utility::AFirstPolicy, utility::ASecondPolicy>
my_function(utility::MyTool<utility::AnotherFirstPolicy, utility::AnotherSecondPolicy>);

如您所见,可读性不是很好。我想从以下位置获得更近的东西:

MyTool<AFirstPolicy, ASecondPolicy>
my_function(MyTool<AnotherFirstPolicy, AnotherSecondPolicy>);

我想知道在这种情况下最好的做法是什么。这是我能想到的:

类型定义

最明显的解决方案。对我来说不是很方便,因为政策可能因功能而异,并带来有关功能使用的重要信息。我希望它们直接出现在函数原型(prototype)中。此外,它在多个命名空间中引入了许多类型名称。

使用指令

放置一个 using namespace utility;using utility::MyTool;在我的文件中使用 utility::AFirstPolicy; 等。

该工具经常被用在来自其他命名空间的头文件中,这使得using-directives不太适合。

全局命名空间中的策略类

我不喜欢这种方法,尤其是因为策略类通常具有模糊的名称,只有在其上下文中才有意义。

宏观

将某物用作

#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属于类模板的接口(interface)utility::MyTool<...> .换句话说,my_function本身属于namespace utility .

这意味着您可以以所需的速记形式编写代码:

namespace utility {   
    typedef MyTool<AFirstPolicy, ASecondPolicy> SomeTool;
    my_function(SomeTool);    
}

您可以在这个旧专栏中阅读更多关于接口(interface)和命名空间的信息 "What's In a Class"赫伯·萨特 (Herb Sutter)。

请注意,即使您想将其他 namespace 中的函数与来自 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 更冗长在实用程序命名空间内,但至少您可以在不输入太多内容的情况下组装所有各种策略。

关于C++ 策略类和命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982550/

相关文章:

c++ - 在模板类的 constexpr 函数中找到正确的宏常量

c# - WPF XAML 合并默认命名空间定义

c++ - 创建尺寸可变的二维数组

c# - 监视系统中的进程启动

c++ - 从 String 到 Type (C++) 的最佳方法是什么

map - Clojure 宏中关键字的奇怪行为

c - 没有宏扩展的延迟字符串化

c++ - 函数中shared_ptr的初始化

C++ "using std::<type>"vs 每次调用 std::<type>

python - 如何让导入的模块使用与主模块相同的对象?