C++中等价于Python的"import as"的是什么?

4

我尝试了几种不同的方法,但都没有成功...

auto& hrctp = std::chrono::high_resolution_clock::time_point;
auto& hrcn = std::chrono::high_resolution_clock::now;

我知道可以使用...

use namespace std::chrono::high_resolution_clock;

我知道在将一种语言的范例复制到另一种语言时,不应该过于努力,但我只是好奇。是否有相应的等价物?


2
有点类似。请参考:http://en.cppreference.com/w/cpp/language/namespace_alias。 - nwp
4
using hrtcp = std::chrono::high_resolution_clock::time_point; - François Andrieux
2
在C++中,类型、函数和命名空间的别名是不同的。time_point是一种类型,因此您可以使用using来定义别名。now是一个静态函数,您可以将其定义为引用别名。 - Cheers and hth. - Alf
1
@legends2k:他已经说过他知道如何重命名命名空间!问题是他想要重命名一个类型和一个函数。 - Martin Bonner supports Monica
1
@JonathanMee 那个评论不完整。它没有回答如何为函数设置别名。 - François Andrieux
显示剩余3条评论
3个回答

2
如果您想定义一个别名,请使用using指令。这意味着以下代码可以正常工作:
using hrctp = std::chrono::high_resolution_clock::time_point;

对于这个函数,您可以使用以下代码:

const auto hrcn = std::chrono::high_resolution_clock::now;

这将创建一个指向静态函数的函数指针。

除非 now 是一个函数,否则您不能使用 using 来为函数定义别名。 - Martin Bonner supports Monica
@MartinBonner 已修复。 - Arnav Borborah

2

这比看起来更加复杂。正如Cheers and hth所说,类型、函数和命名空间的别名是不同的。

对于像std::chrono::high_resolution_clock::time_point这样的简单类型,您可以使用typedefusing

using hrctp = std::chrono::high_resolution_clock::time_point;

或者

typedef std::chrono::high_resolution_clock::time_point hrctp;
< p >使用using的优点是可以将其用于模板类。

对于静态成员函数或嵌入命名空间的独立函数,您只需使用指向该函数的指针:

const auto hrcn = std::chrono::high_resolution_clock::now;

对于非静态成员函数,你不能这样做(指使用指向成员函数的指针),但幸运的是你不需要这样做(因为你可以在适当类型的对象上调用非静态成员函数)。


time_point 的选项纯粹在编译时完成。然而,函数别名可能会带来运行时开销(因为你通过指针调用函数,而不是直接跳转到函数)。不过,首先要为了清晰性编写代码,其次才是为了速度。(另一方面,C++ 的方式可能是:

using hrc =std::chrono::high_resolution_clock;

然后使用hrc::time_pointhrc::now


非常好的回答,Martin,谢谢。还有感谢你的样式提示! - Roger Heathcote

2

很简单。简短回答...对于类型和函数而言,情况是不同的。

// Alias the type...
using hr_time_point = std::chrono::high_resolution_clock::time_point;

// Create reference (like an alias) for the function
auto &hr_now = std::chrono::high_resolution_clock::now;

编译器会无疑地优化掉引用,并直接调用被引用的对象。
以下写法同样有效:
inline auto hr_now() { return std::chrono::high_resolution_clock::now(); }

优化器将会消除这个间接引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接