c++ - 更简洁代码的嵌套命名空间

标签 c++ namespaces coding-style naming

<分区>

我目前正在编写一个适配器来在两个框架 A <-> B 之间转换类型。我对名称有点不满意,因为在我看来它们变得很长而且难以阅读。然后我决定以一种完全嵌套的方式使用命名空间,这在其他地方很少见。

旧:

TypeA mylib::cvtToAtype(TypeB) {}
TypeB mylib::cvtToBtype(TypeA) {}

新:

TypeA mylib::cvt::to_a::type(TypeB) {}
TypeB mylib::cvt::to_b::type(TypeA) {}

您认为这是一种很好的风格还是认为它有很大的缺点?我认为它看起来很干净,但是如果有人决定“使用 namespace ”,它可能会被滥用。那么 type 实际上并不是一个唯一的名称来标识函数在做什么。此外,名为“cvt”的命名空间也可能不是 super 唯一的。

你怎么看?

最佳答案

所以,您开始于:

TypeA mylib::cvtToAtype(TypeB) {}
TypeB mylib::cvtToBtype(TypeA) {}

您陈述的问题:函数名称​​“变得很长且不可读”。你提议:

mylib::cvt::to_a::type

首先,“cvt”不会被代码的读者/维护者轻松识别为“转换”。尾随 ::type对我来说似乎毫无意义。任何称为“to_”的东西都可以预期是一个转换,所以我看不到 ::cvt:: 中的重点水平。

无论其值(value)如何,一些替代方案......

构造函数

您可以考虑创建构造函数 [explicit] TypeA::TypeA(TypeB)[explicit] TypeB::TypeB(TypeA)所以客户端的用法很简单:

TypeA a{b};
functionThatWantsB(TypeB{a});

转换/转换模板

如果您希望将函数与 TypeA/B 类分开,具有专门化的“cast”样式模板是一个不错的选择:

template <typename TypeTo, typename TypeFrom>
TypeTo convert(const TypeFrom&);

template <>
TypeB convert<TypeB, TypeA>(const TypeA& a) { return TypeB{...}; }

template <>
TypeA convert<TypeA, TypeB>(const TypeB& a) { return TypeA{...}; }

然后客户端用法就是熟悉的转换符号:例如convert<TypeB>(a) .这比 cvtToAtype 强大得多因为如果目标类型是抽象的 - 模板中的参数,来自 using 的别名或 typedef - 你仍然可以施法。

知道目标类型,因为它是一个函数参数

另一种选择是使用转换为类型的函数参数,因此调用者不必将其作为转换函数名称或模板参数的一部分键入:

TypeA& loadFrom(TypeA&, const TypeB&) { ... }
TypeB& loadFrom(TypeB&, const TypeA&) { ... }

重载的编译时多态性的这种使用意味着每次涉及的变量在支持的类型之间发生变化时不需要更新转换代码。

关于c++ - 更简洁代码的嵌套命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49960883/

相关文章:

c++ - "if"条件下的变量赋值

c++ - 冒泡排序链表 C++

c++ - 重复符号问题

c++ - 当声明一个对象时,如果它不明确,你如何指定无名称

language-agnostic - Program into Your Language 和 Program in Your Language 的含义

c++ - 无法初始化初始化列表之外的字段

c++ - MFC - 扩展应用程序以从命令行运行

Python - 如何从扩展命名空间导入父包

design-patterns - 应用干净的代码和 SOLID 原则花了我很多时间 : normal?

c++ - 我如何使用 clang-format 缩进 C++ pragma?