Hoo*_*voo 7 c++ scope using-directives type-alias
对于我的项目,我正在使用一些非常复杂的数据结构,例如
std::unordered_map<int, std::list<std::shared_ptr<const Foo>>>
Run Code Online (Sandbox Code Playgroud)
为此,我想声明类型别名以提高可读性。我在其上构建项目的代码已经通过将using语句全局放在头文件中来实现:
std::unordered_map<int, std::list<std::shared_ptr<const Foo>>>
Run Code Online (Sandbox Code Playgroud)
由于我的C ++知识有点生锈,所以我只是采用了这种样式-但现在我读到,using以这种方式使用可能会出现问题,因为它将这种别名强制应用于包含此标头的所有内容。
尽管进行了大量的谷歌搜索,但我找不到如何正确处理此问题的具体答案,只有很多关于不该做什么的陈述。因此,我只是将use放在类中:
// bar.h
#ifndef BAR_H
#define BAR_H
#include <unordered_map>
#include <list>
#include <memory>
#include "foo.h"
using FooTable = std::unordered_map<int, std::list<std::shared_ptr<const Foo>>>;
class Bar {
FooTable create_foo();
};
#endif
Run Code Online (Sandbox Code Playgroud)
但是,这样做的缺点是,我需要在源文件中重新声明别名:
// bar.h
#ifndef BAR_H
#define BAR_H
#include <unordered_map>
#include <list>
#include <memory>
#include "foo.h"
class Bar {
using FooTable = std::unordered_map<int, std::list<std::shared_ptr<const Foo>>>;
FooTable create_foo();
};
#endif
Run Code Online (Sandbox Code Playgroud)
尽管这似乎可行,但我不确定这是否安全...而且我的直觉告诉我这有点丑陋。因此,在我像这样重写整个项目之前,我想过要问:有没有一种更好/更优雅/更安全的方法呢?还是我应该完全避免在头文件中使用类型别名?
但是,这样做的缺点是,我需要在源文件中重新声明别名:
那是不对的。您只需要使它public然后指定适当的范围,就可以Bar::FooTable在Bar(包括返回类型,除非有尾随!)的范围之外调用它:
Bar::FooTable Bar::create_foo()
{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)
要么
auto Bar::create_foo() -> FooTable
{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)
(在定义内就FooTable可以了,因为它是成员!)
您的方法很好,尽管我也将所有内容都放在命名空间中。然后,别名是否在类中并不重要:它仍然独立存在于您自己的代码中。它纯粹是样式问题,对其他任何人几乎没有影响。