【问题标题】:static_cast's argument forwardingstatic_cast 的参数转发
【发布时间】:2013-06-13 06:50:54
【问题描述】:

假设我不喜欢 static_cast 运算符的名称,并且想将其包装在一个具有不同名称的函数中,例如 fancy_static_cast,但完美地保留了语义。我该怎么做?更具体地说,static_cast 是否通过值或引用接受它的参数?还是取决于参数表达式?我应该提供几个重载还是像这样的东西可以解决问题?

template <typename To, typename From>
To fancy_static_cast(From&& from)
{
    return static_cast<To>(std::forward<From>(from));
}

【问题讨论】:

  • static_cast 不是一个函数,它是一个特殊的编译器关键字,在编译时完全由编译器处理。
  • @JoachimPileborg 我从来没有说过它是一个函数,也不是一个编译器指令。 static_cast 是一个操作员。但这到底有多重要?
  • @yurikilochek 运算符没有函数语义——它们不接受“按值”或“按引用”的参数。它们是根据左值和右值定义的,并且可以很好地包含诸如“如果它是一个特定的左值,那么……,否则将其视为右值……”之类的逻辑

标签: c++ argument-passing static-cast perfect-forwarding


【解决方案1】:

假设我不喜欢 static_cast 运算符的名称,并且想将其包装在一个具有不同名称的函数中,比如 fancy_static_cast 但完美地保留了语义。我该怎么做?

你不应该。

相反,当您意思是 static_cast 时,您 static_cast。否则你只会缺乏可维护性:你的代码的读者一开始不会认出static_cast,当他们看到这个函数时,他们不会知道你为什么要这样做并且浪费脑力只是为了实现你基本上什么都不做。

代码清晰明了。说出你的意思,不要用过分的花哨来欺骗读者(包括你自己)。不要使用误导性的命名,而是尝试使用每个人都熟记的语言部分。尽可能少给自己和他人误解您所写内容的机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2010-10-10
    • 2011-10-31
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多