C++ 模板默认为包含更多模板的模板

C++ 模板默认为包含更多模板的模板,c++,c++11,templates,chrono,C++,C++11,Templates,Chrono,我正在尝试创建一个具有基于另一个模板的模板返回类型的函数,我也希望将其设置为默认值。很难解释,但代码如下: template<template<typename ReturnType = float, typename> DurationType = std::chrono::duration<ReturnType, std::milli> > ReturnType tick() { high_resolution_clock::time_point

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

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-like返回,并指定返回类型的单位。在本例中,我希望它默认为毫秒。这可能吗?

我不清楚您到底想要什么express和什么default

例如,您可以使用默认值定义模板ReturnT类型,并使用依赖于ReturnT的默认值表示DurationT类型;差不多

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();
 }
我想不是

所以我认为你应该只表达一种类型,然后派生另一种类型

您可以使用std::chrono::duration default表示DurationT,并从中推断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();
 }
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();
 }

你想在这里实现什么还不清楚。为什么要将DurationType升级到函数的模板参数,而它甚至没有出现在它的界面中?您可以将ReturnType作为唯一的模板参数,并将DurationType替换为auto。我一直认为我需要使用模板模板。。。因为我的模板中有另一个模板。@ChaoSXDemon-在某些情况下是有用的;但我不认为在这种情况下。
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();
 }