【问题标题】:Shortening C++ template function name缩短 C++ 模板函数名称
【发布时间】:2018-03-13 18:01:34
【问题描述】:

我知道,要缩短类名,我可以执行以下操作:

using Time = std::chrono::time_point<std::chrono::system_clock>;
using Clock = std::chrono::system_clock;

但是如何正确减少下一行的长度呢?

/*using Ms = */ std::chrono::duration_cast<std::chrono::milliseconds>

目标代码:

Time start = Clock::now();
// something
Time end = Clock::now();
std::cout << Ms(end - start).count() << std::endl;

【问题讨论】:

  • 你不能创建函数的别名。
  • @Justin 我想在标题中使用这段代码,所以我不想写这样的东西。而且我认为 duration_cast 仍然很丑很长。
  • 可以做一个辅助函数:inline auto Ms(decltype(Time{} - Time{}) duration) { return std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(duration); }
  • @Eljay 这就是答案

标签: c++ c++11


【解决方案1】:

您有几个选择。你可以使用using declaration:

void foo() {
    // These can be scoped to the function so they don't bleed into your API
    using std::chrono::duration_cast;
    using std::chrono::milliseconds;

    Time start = Clock::now();
    // something
    Time end = Clock::now();
    std::cout << duration_cast<milliseconds>(end - start).count() << std::endl;
}

或者,您可以编写自己的函数:

template <typename Duration>
auto as_ms(Duration const& duration) {
    return std::chrono::duration_cast<std::chrono::milliseconds>(duration);
}

void foo() {
    Time start = Clock::now();
    // something
    Time end = Clock::now();
    std::cout << as_ms(end - start).count() << std::endl;
}

【讨论】:

  • 看,现在你的答案就是答案!我的评论只是一个概念。 ;-)
  • @Eljay 是的,但是您没有理由不能将其发布为答案。 :)
  • 那么,为什么不像 Eljay 所说的那样 inline auto 呢?
  • 您还可以为整个 std::chrono 命名空间使用一个 using-声明。我理解为什么您可能不希望在更大范围内为整个命名空间使用using-声明,但对于这种大小的函数,危险似乎很小。
  • @BenS。我不推荐using namespace std::chrono; 它在其他语言中的类比是* 导入(例如import java.util.*;)在大多数情况下这不是一个好主意,因为您很容易以名称冲突告终。如果您需要的 using 声明的数量很少(在这种情况下它只有 2 个),那么无论如何都不会再打字了。 OTOH,我确实一直使用命名空间别名 (namespace chr = std::chrono;)
【解决方案2】:

从 c++17 开始,lambda 默认为 constexpr,这使它们成为模板函数的绝佳别名,而没有所有令人不快的模板语法:

#include <chrono>
#include <iostream>

void test()
{
    using Clock = std::chrono::system_clock;
    using Time = Clock::time_point;

    auto Ms = [](auto&& duration)
    {
        return std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
    };

    auto start = Clock::now();
    // something
    auto end = Clock::now();
    std::cout << Ms(end - start) << std::endl;
}

【讨论】:

    【解决方案3】:

    您所说的缩短类名实际上是类型别名。 Type aliases 用于类型。 std::chrono::duration_cast&lt;std::chrono::milliseconds&gt; 不是类型。它是一个函数。您不能为函数创建别名。

    【讨论】:

    • 谢谢,我很清楚。我想知道是否有一个漂亮的解决方案,因为我总是可以使用带有该字符串的#define 来解决问题。
    • 函数指针有别名,您也可以将函数包装到另一个函数中。你是否应该是另一个主题。
    • @BhavinChirag 我强烈建议不要使用#define。如果您确实想使用它,请确保您#undef 它。
    • @贾斯汀确实。绝对避免#define 和(过多)宏编程。
    【解决方案4】:

    预处理器可供您利用,如果您愿意,您可以使用宏。

    #define TIME std::chrono::time_point<std::chrono::system_clock>
    #define CLOCK std::chrono::system_clock;
    #define TIME_AS_MS std::chrono::duration_cast<std::chrono::milliseconds>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多