【发布时间】:2014-10-03 17:56:29
【问题描述】:
您可以使用 typedef 为类型创建一个更短更简单的名称:
typedef std::chrono::high_resolution_clock Clock;
typedef Clock::time_point TimePoint;
typedef std::chrono::seconds Seconds;
typedef std::chrono::milliseconds Milliseconds;
以及实例化的模板类型:
typedef std::chrono::duration<float, std::ratio<1>> RealDuration;
// Example usage
float dt = RealDuration(a - b).count();
对于函数指针:
typedef void (*FuncPtr)(int,int);
您还可以为模板使用类型别名:
template<typename T> using uptr = std::unique_ptr<T>;
// Example usage
uptr<int> myInt;
uptr<foo> myFoo;
但是如何创建一个指向模板函数的别名/指针呢?例如,如果我希望能够使用名称 DurationCast 来编写如下内容:
x = DurationCast<Seconds>(a - b);
y = DurationCast<Milliseconds>(c - d);
需要做些什么来将函数std::chrono::duration_cast<T>() 缩短为仅DurationCast<T>(),而不是简单地走using namespace std::chrono; 或using std::chrono::duration_cast; 路由,并且不编写我自己的函数对象来实现它?
编辑: 我想我可以围绕它写一个简单的包装器:
template<typename ToType, typename FromType>
ToType DurationCast(const FromType& d)
{
return std::chrono::duration_cast<ToType>(d);
}
不像别名那样工作,但最终结果是我可以以与我的目标完全相同的方式使用它:
x = DurationCast<Seconds>(a - b);
【问题讨论】:
-
仅供参考,
duration_cast在std::chrono;不仅仅是std。我想using std::chrono;避免在所有std中啜泣同样不在你的视线范围内,尽管几乎每个人 最终都会这样做。 -
哎呀,我知道。固定问题。
-
@derpface:您可以模板化作为函数指针的变量,但是您必须指定所有参数,例如
DurationCast<std::chrono::milliseconds, float, std::ratio<1>>(s),这个适合你吗? -
@derpface:或者至少在声明之前知道,什么是表示和期限
-
相对确定你必须包装函数而不是使用
typedef- 你可以typedef函数指针,但不是函数AFAIK(请纠正并@reference 我在评论中如果我我错了!)
标签: c++