您可以使用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);
答案 0 :(得分:7)
您可以创建一个辅助函数,转发到duration_cast
:
template <typename T, typename U>
auto DurationCast(U const& u) -> decltype(std::chrono::duration_cast<T>(u))
{
return std::chrono::duration_cast<T>(u);
}
答案 1 :(得分:6)
如何创建模板化函数的别名/指针?
您可以为函数指针类型的变量添加别名:
template <typename T>
void foo()
{
std::cout << "foo!" << (T)3.14f << std::endl;
}
template <typename T>
constexpr void(*foo_alias)() = &foo<T>;
int main()
{
foo_alias<int>(); // 3
foo_alias<float>(); // 3.14
}
例如,如果我希望能够使用名称
DurationCast
(...)需要做什么才能将函数std::chrono::duration_cast<T>()
简化为DurationCast<T>()
?
指向函数的技巧是你必须指定所有类型的参数来获取函数的地址,因此,你需要所有参数&#39;显式给定或模板化的类型。不幸的是,std::chrono::duration_cast
有三个参数:
template <typename T, class Rep, class Period>
constexpr T(*DurationCast)(const std::chrono::duration<Rep, Period>&) = &std::chrono::duration_cast<T, Rep, Period>;
std::chrono::seconds s(1);
std::chrono::milliseconds ms = DurationCast<std::chrono::milliseconds, float, std::ratio<1>>(s);
// ~~~~^ ~~~~~~~~~~~~^
// explicit representation and period