【问题标题】:Can we rename cout, endl keyword in cpp?我们可以在 cpp 中重命名 cout、endl 关键字吗?
【发布时间】:2020-08-09 18:16:20
【问题描述】:

由于 typedef 可以更改类型的名称,而 define 可以为值和函数创建别名, 有什么办法可以改cout、endl等的名字???

【问题讨论】:

  • auto& cout_by_another_name = std::cout; 不清楚您为什么要这样做,但就是这样。
  • @t.niese 参考将适用于两者。 using 仅别名类型。

标签: c++


【解决方案1】:

我们可以在 cpp 中重命名 cout、endl 关键字吗?

coutendl 都不是 C++ 中的关键字。它们是在标准库的std 命名空间中声明的名称。前者是变量,后者是函数模板。

你不能“重命名”变量或函数模板,就像你不能重命名类型一样,但是就像你可以为类型创建别名一样,你基本上可以使用引用为变量实现相同的效果:

auto& some_name = std::cout;

对于函数模板,一种选择是编写一个包装函数模板:

template<class CharT, class Traits>
auto&
endl_wrapper(std::basic_ostream<CharT, Traits>& os)
{
    return std::endl(os);
}

避免使用不必要的别名混淆程序。

【讨论】:

  • 这个。重要的是要注意,大多数 C++ 标准库只是您可以自己编写的预构建 C++ 代码,并且没有*魔法。 *其中一小部分实际上是内置在语言中的,即:en.cppreference.com/w/cpp/freestanding
【解决方案2】:

有两种方法可以做到这一点。在 C++ 意义上,您可以使用 std::ostream:

#include <iostream>
std::ostream& alias = std::cout;

或者,以更好的方式,使用对auto 的引用让编译器决定正确的类型。

auto& print = std::cout;

一些重要说明:

  1. 您不能使用using 语句创建std::coutstd::endl 等的别名。

  2. 由于std::endl是一个模板函数而不是一个类型,所以不能使用对自动类型的引用来推断它。


OTOH,您可以使用#define 语句(类似C):

#include <iostream>
#define print std::cout <<
#define end   << std::endl
.
.
print "Hello world!" end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2018-04-23
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多