我的项目中使用了一些相当复杂的数据结构,例如:
std::unordered_map<int, std::list<std::shared_ptr<const Foo>>>
我希望为了可读性声明类型别名。我构建项目的代码已经通过在头文件中全局使用using
语句来完成此操作:
// 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
由于我的C++知识有些生疏,所以我采用了这种风格——但现在我读到了使用using
会有一些问题,因为它会强制给包含该头文件的所有内容起一个别名。
尽管我进行了大量的谷歌搜索,但我没有找到如何正确处理这个问题的明确答案,只有许多关于不要这样做的陈述。所以,我将using
放在了类内部:
// 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
然而这种方法有缺点,就是我需要在源文件中重新声明别名:
// bar.cpp
#include "bar.h"
using FooTable = std::unordered_map<int, std::list<std::shared_ptr<const Foo>>>;
FooTable Bar::create_foo()
{
...
}
虽然这似乎可以工作,但我不确定这是否安全...我的直觉告诉我这有点丑陋。所以在像这样重写整个项目之前,我想问一下:有更好/更优雅/更安全的方法来做到这一点吗?还是应该完全避免在头文件中使用类型别名?
typedef
。 - BathshebaFooTable
的作用域在Bar
类中。因此,您需要在Bar::create_foo()
中指定,例如Bar::FooTable
。 - Some programmer dudeBar :: FooTable
进行调用即可。 - Zoe stands with Ukraine