C++ 如何编写带参数的函数,使用'推导哪种类型;自动';单词

C++ 如何编写带参数的函数,使用'推导哪种类型;自动';单词,c++,c++11,c++14,c++17,C++,C++11,C++14,C++17,我正在寻找一种干净的c++11(直到c++17)方法来编写一个函数,该函数只需在给定的“开始”和“停止”时间(例如,给定间隔时间)将fps写入输出流。 我有这样的代码,例如: #包括 int main(int argc,字符**argv){ typedef std::chrono::高分辨率时钟时间; 而(1){ 自动启动=时间_t::now(); //下面是函数的调用,它可以做一些事情 //在本例中,将进行打印 std::cout这是一个简单的模板声明案例(尽管C++20可能更简单,并且接受您

我正在寻找一种干净的c++11(直到c++17)方法来编写一个函数,该函数只需在给定的“开始”和“停止”时间(例如,给定间隔时间)将fps写入输出流。 我有这样的代码,例如:

#包括
int main(int argc,字符**argv){
typedef std::chrono::高分辨率时钟时间;
而(1){
自动启动=时间_t::now();
//下面是函数的调用,它可以做一些事情
//在本例中,将进行打印

std::cout这是一个简单的模板声明案例(尽管C++20可能更简单,并且接受您的语法):

模板
std::ostream和printFPS(std::ostream和stream,持续时间开始);
然后是定义:

template<typename Duration>
std::ostream & printFPS(std::ostream &stream, Duration start)
{}
模板
std::ostream和printFPS(std::ostream和stream,持续时间开始)
{}

您可以使用
decltype
来推断时间类型并将其用作参数的类型

using time_type = decltype(std::chrono::high_resolution_clock::now());

std::ostream & printFPS(std::ostream &stream, time_type start);

表达式
std::chrono::high_resolution_clock::now()
返回类型为
std::chrono::high_resolution_clock::time_point
的值

std::ostream& printFPS(std::ostream&, std::chrono::high_resolution_clock::time_point );
但打印功能可能并不关心从哪个时钟获取
时间点
。它只关心获取
时间点
,因此您可以更一般地执行此操作:

template <typename Clock, typename Duration>
std::ostream& printFPS(std::ostream&, std::chrono::time_point<Clock, Duration> );
模板
std::ostream和printFPS(std::ostream和std::chrono::time_点);

这是一个规范的解决方案。尽管我个人质疑是否需要它;不仅返回类型不太可能以任何有意义的方式改变,而且如果它改变了,您可能想知道它,以便检查您的所有用法。让类型系统为您工作;不要隐藏它!@LightnessRacesinOrbit这取决于用例。如果出于某种原因,您需要将时钟设置为
高分辨率\u clock
,然后明确要求将其作为参数,但如果您只想使用与其他地方相同的时钟,这是可以的(尽管我认为模板化函数可能更通用)。这个问题似乎暗示了第二种情况。OP问的是关于推导时钟类型的问题。@FrançoisAndrieux我的观点是关于[mis?]在不需要的情况下使用类型推断,并且所说的类型推断会丢失有用的接口更改的实际通知。这是反AAA参数。downvoter是否不赞成使用时钟的类型别名或函数模板?仅供参考
time\u t
对于时钟的类型是一个非常糟糕的选择。已经存在一个错误表示时间单位的pe(读代码时我很困惑,看到
time\u t::now()
)但是你用它来表示一个时钟,这是一个非常不同的东西。使用像
Clock\t
这样的东西会好得多。另外,当我在这里时,在C++11及以后,更喜欢
使用
而不是
typedef
使用Clock\t=std::chrono::high\u resolution\u Clock;
读起来更好,因为你的名字是int回溯总是在左边,而你混淆的东西总是在右边(而不是有时在中间的乐趣,<代码> TyPuff给我们)。哦,你是对的,它被添加为主内的局部Type()。,只是为了提高可读性。我知道它可能会导致一些硬错误。感谢
使用clock\u t=std::chrono::high\u resolution\u clock;
不知道此语法
template <typename Clock, typename Duration>
std::ostream& printFPS(std::ostream&, std::chrono::time_point<Clock, Duration> );