C++ C++;在标题中使用声明与类型别名
在C++11项目中,我想将标准库名称空间(C++ C++;在标题中使用声明与类型别名,c++,c++11,C++,C++11,在C++11项目中,我想将标准库名称空间(std)中的一些标识符引入项目名称空间(proj),以增强可读性。例如,我希望能够在任何地方使用string,而不是std::string 请注意,此项目是一个应用程序,而不是一个库,其代码随后将被其他项目包含 这可以通过将代码添加到项目中任何地方包含的公共头中来实现。实际引入标识符的两种方法如下所示: #ifndef PROJ_H #define PROJ_H #include "stuff.h" #include <string> n
std
)中的一些标识符引入项目名称空间(proj
),以增强可读性。例如,我希望能够在任何地方使用string
,而不是std::string
请注意,此项目是一个应用程序,而不是一个库,其代码随后将被其他项目包含
这可以通过将代码添加到项目中任何地方包含的公共头中来实现。实际引入标识符的两种方法如下所示:
#ifndef PROJ_H
#define PROJ_H
#include "stuff.h"
#include <string>
namespace proj
{
// method 1 - using declaration
using std::string;
// method 2 - type alias
using string = std::string;
}
#endif
\ifndef项目
#定义项目
#包括“stuff.h”
#包括
名称空间项目
{
//方法1-使用声明
使用std::string;
//方法2-类型别名
使用string=std::string;
}
#恩迪夫
我觉得方法2优于方法1。原因是如果stuff.h
向匿名命名空间引入了string
标识符,那么从proj
命名空间内部使用string
将是不明确的
我的问题是:
std::make_unique
)实现相同的安全级别这两种方法都是相同的,您可以通过在名称空间中使用
static\u assert
来证明这一点
static_assert(std::is_same<std::string, string>::value, "types are not the same"); // succeeds and does NOT complain
您不能做的是在名称空间
proj
中引入一个新类型或typedef名称。我更喜欢使用using声明来表示它仍然是相同的类型。尽管别名声明没有引入新的类型,但在语义上它感觉像是一个新的类型——但这只是个人的事情。“如果stuff.h
向匿名名称空间引入了string
标识符,那么从proj
名称空间内部使用string
将是不明确的。”不会。此外,头文件中的匿名名称空间很少见。@JonathanWakely,嗯,很有趣。我假设使用std::string
与使用命名空间std
会有同样的歧义问题。单独包含的标识符似乎比作为名称空间一部分包含的成员强得多。你知道这是为什么吗?这种不一致似乎有点痛苦,因为它们不一样。为什么不同用途的两个不同功能应该保持一致?“那将是多余的。”乔纳桑:我不同意这种说法。从程序员的角度来看,这两种用法是“我想让这个名称可见”和“我想让这个名称空间中的所有名称可见”。为两个“使可见”操作指定不同的语义是误导性的。程序员的观点不是语言所说的,如果错误的理解与现实不符,我也无能为力:-)
::string s1;
string s2;