我正在尝试创建一个具有基于另一个模板的模板返回类型的函数,我也想将其设为默认值。很难解释,但这是代码:
template<template<typename ReturnType = float, typename> DurationType = std::chrono::duration<ReturnType, std::milli> >
ReturnType tick()
{
high_resolution_clock::time_point currentPoint = high_resolution_clock::now();
DurationType elapsed = currentPoint - mStartTimePoint;
mStartTimePoint = currentPoint;
return elapsed.count();
}
显然上面没有编译,但我想做的是让函数返回 ReturnType
(float
或 double
可能) 并指定返回类型的单位。在这种情况下,我希望它默认为毫秒。这可能吗?
最佳答案
我不清楚你到底想要什么,你想要什么默认。
例如,您可以定义一个模板 ReturnT
键入,使用默认值,并表示 DurationT
使用依赖于 ReturnT
的默认值键入;像
template <typename ReturnT = float,
typename DurationT = std::chrono::duration<ReturnT, std::milli>>
ReturnT tick0 ()
{
std::chrono::high_resolution_clock::time_point
currentPoint { std::chrono::high_resolution_clock::now() };
DurationT elapsed { currentPoint } ;
return elapsed.count();
}
但是可以接受使用 DurationT
调用此函数返回类型不同于 ReturnT
?
我的意思是:可以接受以下调用吗?
foo0<long double, std::chrono::duration<float, std::milli>>();
我想不是。
所以我认为你应该只表达一种类型并派生另一种。
你可以表达DurationT
, 与 std::chrono::duration<float, std::milli>
默认,并推导出ReturnT
从中;举例说明
template <typename DurationT = std::chrono::duration<float, std::milli>>
decltype( std::declval<DurationT>().count() ) tick1 ()
{
std::chrono::high_resolution_clock::time_point
currentPoint { std::chrono::high_resolution_clock::now() };
DurationT elapsed { currentPoint } ;
return elapsed.count();
}
或者你可以表达ReturnT
, 默认为 float
, 并推导出 DurationT
从中;举例说明
template <typename ReturnT = float>
ReturnT tick2 ()
{
using DurationT = std::chrono::duration<ReturnT, std::milli>;
std::chrono::high_resolution_clock::time_point
currentPoint { std::chrono::high_resolution_clock::now() };
DurationT elapsed { currentPoint } ;
return elapsed.count();
}
关于c++ - 模板默认为具有更多模板的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47130706/