c++ - 模板默认为具有更多模板的模板

标签 c++ c++11 templates c++-chrono

我正在尝试创建一个具有基于另一个模板的模板返回类型的函数,我也想将其设为默认值。很难解释,但这是代码:

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 (floatdouble 可能) 并指定返回类型的单位。在这种情况下,我希望它默认为毫秒。这可能吗?

最佳答案

我不清楚你到底想要什么,你想要什么默认。

例如,您可以定义一个模板 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/

相关文章:

wpf - 加载控件后立即启动模板动画

C++——在一个类的不同模板化版本之间进行转换的方法

c# - 声明变量(内存中的确切位置)

c++ - 是否有即时编译的正则表达式引擎?

c++ - DBExpress和mysql最后插入id

c++ - 为什么 std::is_same 不起作用?

c++ - 如何声明任何继承类的实例?

c++ - 使用 std::generate 生成矩阵

c++ - 将 vector 的 vector 合并为单个 vector

c++ - 如果 constexpr 而不是标签分派(dispatch)