C++ C++;在标题中使用声明与类型别名

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

在C++11项目中,我想将标准库名称空间(
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
将是不明确的

我的问题是:

  • 方法2是否真的如我所建议的那样优越,还是严格等同
  • 如果方法2更好,如何为非类型标识符(如
    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;