gpt4 book ai didi

C++ 在 header 中使用声明与类型别名

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:39 26 4
gpt4 key购买 nike

在 C++11 项目中,我想将标准库命名空间 (std) 中的一些标识符引入项目的命名空间 (proj) 以增强可读性。例如,我希望能够使用 string到处而不是std::string .

请注意,此项目是一个应用程序,而不是其代码随后将被其他项目包含的库。

这可以通过将代码添加到项目中随处包含的通用 header 来实现。实际引入标识符的两种方法如下所示:

#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

我觉得方法 2 优于方法 1。原因是如果 stuff.h介绍一个string匿名命名空间的标识符,然后使用 stringproj 里面命名空间将是不明确的。

我的问题:

  1. 方法 2 真的像我建议的那样优越,还是它们严格等效?
  2. 如果方法 2 更好,我如何才能为非类型标识符(例如 std::make_unique 之类的函数)实现相同级别的安全性。

最佳答案

这两种方式是相同的,您可以通过在命名空间中使用 static_assert 来证明这一点。

static_assert(std::is_same<std::string, string>::value, "types are not the same"); // succeeds and does NOT complain

string identifier to the anonymous namespace then use of string from inside the proj namespace will be ambiguous.

在这种情况下,您只需编写 ::string 来指定您要使用的字符串。

::string s1;

string s2;

您不能做的是在命名空间 proj 中引入新类型或 typedef-name。我更喜欢使用 using 声明 来表示它仍然是同一类型。虽然别名声明没有引入新类型,但感觉像是语义上的新类型 - 但这只是个人问题。

关于C++ 在 header 中使用声明与类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32751249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com