C++ 缩短C++;模板函数名

C++ 缩短C++;模板函数名,c++,c++11,C++,C++11,我知道,要缩短类名,我可以执行以下操作: using Time = std::chrono::time_point<std::chrono::system_clock>; using Clock = std::chrono::system_clock; 使用Time=std::chrono::Time\u点; 使用时钟=标准::时钟::系统时钟; 但如何适当缩短下一行的长度呢 /*using Ms = */ std::chrono::duration_cast<std::c

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

using Time = std::chrono::time_point<std::chrono::system_clock>;
using Clock = std::chrono::system_clock;
使用Time=std::chrono::Time\u点;
使用时钟=标准::时钟::系统时钟;
但如何适当缩短下一行的长度呢

/*using Ms = */ std::chrono::duration_cast<std::chrono::milliseconds>
/*使用Ms=*/std::chrono::duration\u cast
目标代码段:

Time start = Clock::now();
// something
Time end = Clock::now();
std::cout << Ms(end - start).count() << std::endl;
Time start=Clock::now();
//某物
时间结束=时钟::现在();

std::cout您所谓的缩短类名实际上是类型别名。用于类型<代码>std::chrono::duration_cast
不是类型。这是一个函数。您不能为函数生成别名。

您所谓的缩短类名实际上是类型别名。用于类型<代码>std::chrono::duration_cast不是类型。这是一个函数。您不能为函数创建别名。

您有两个选项。您可以使用:

void foo(){
//这些可以限定在函数的范围内,这样它们就不会渗透到API中
使用std::chrono::duration\u cast;
使用std::chrono::毫秒;
时间开始=时钟::现在();
//某物
时间结束=时钟::现在();

std::cout您有几个选项。您可以使用:

void foo(){
//这些可以限定在函数的范围内,这样它们就不会渗透到API中
使用std::chrono::duration\u cast;
使用std::chrono::毫秒;
时间开始=时钟::现在();
//某物
时间结束=时钟::现在();

std::cout从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;
}
#包括
#包括
无效测试()
{
使用时钟=标准::时钟::系统时钟;
使用时间=时钟::时间点;
自动Ms=[](自动和持续时间(&D)
{
返回std::chrono::duration_cast(duration).count();
};
自动启动=时钟::现在();
//某物
自动结束=时钟::现在();

std::cout从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;
}
#包括
#包括
无效测试()
{
使用时钟=标准::时钟::系统时钟;
使用时间=时钟::时间点;
自动Ms=[](自动和持续时间(&D)
{
返回std::chrono::duration_cast(duration).count();
};
自动启动=时钟::现在();
//某物
自动结束=时钟::现在();

std::cout预处理器是供您利用的,如果您愿意,您可以使用宏

#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>
#定义时间标准::计时::时间点
#定义时钟std::chrono::系统时钟;
#将时间定义为\u MS std::chrono::duration \u cast

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

#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>
#定义时间标准::计时::时间点
#定义时钟std::chrono::系统时钟;
#将时间定义为\u MS std::chrono::duration \u cast


你不能创建函数别名。相关:@Justin我想在标题中使用这段代码,所以我不想写这样的东西。我认为duration_cast仍然很难看和长。你可以创建一个helper函数:
内联自动Ms(decltype(Time{}-Time{})duration){返回std::chrono::duration_cast(duration);}
@Eljay这是一个答案你不能创建函数的别名。相关:@Justin我想在头中使用这段代码,所以我不喜欢写这样的东西。我认为duration\u cast仍然很难看而且很长。你可以创建一个helper函数:
内联自动Ms(decltype(Time{}-Time{})duration duration){return std::chrono::duration\u cast(持续时间);}
@Eljay这是一个答案谢谢,这对我来说很清楚。我想知道有没有一个漂亮的解决方案,因为我总是可以使用#define with the string来解决这个问题。函数指针有别名,你也可以将函数包装到另一个函数中。你是否应该是另一个主题。@BhavinChirag我强烈推荐不要使用
#define
。如果您确实想使用它,请确保您
#undef
它。@Justin确实如此。一定要避免
#define
和(太多)宏编程。谢谢,这对我来说很清楚。我想知道有没有一个漂亮的解决方案,因为我总是可以使用#define和该字符串来解决这个问题。函数指针有别名,你也可以将函数包装到另一个函数中。你是否应该是另一个主题。@BhavinChirag我强烈建议不要使用
#define
。如果你想使用它,一定要
#undef
它。@Justin确实如此。一定要避免
#define
和(太多)宏编程。看,现在你的答案是答案!我的评论只是一个概念。;-)@Eljay是的,但是你没有理由不把它作为一个答案发布出来。:)那么,为什么不像Eljay所说的那样内联自动呢?你也可以对整个
std::chrono
命名空间使用一个
声明。我理解为什么你可能不想在更大范围内对整个命名空间使用
声明,但是对于这种大小的函数,危险似乎很小。@BenS。我不建议
使用名称空间std::chrono;
在其他语言中类似于
*
导入(例如
导入java.util.*;
)在大多数情况下,这不是一个好主意,因为很容易导致名称冲突。如果使用
声明的
数量很少(在本例中仅为2个),那么输入就不会太多。OTOH,我确实一直使用名称空间别名(
名称空间chr=std::chrono;
)看,现在你的答案是答案!我的评论只是一个概念。-@Eljay是的,但是没有理由你不能把它作为答案发布。:)那么,为什么不按照Eljay所说的内联自动呢?你也可以对整个
std::chrono
命名空间使用一个
声明。我理解你为什么不想要
对la中的整个命名空间使用
-声明