2017-11-06 17 views
0

다른 서식 파일을 기반으로하는 서식 파일 반환 유형이있는 함수를 만들려고합니다. 기본값으로 설정하려고합니다. 그것은 그것을 설명하기 어렵다하지만 여기에 코드입니다 : 분명히서식 파일이 더 많은 서식 파일을 기본 서식 파일로 설정

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 가능성) 및 함수 반환을하지 않습니다 리턴 유형. 이 경우 기본값은 밀리 초가됩니다. 이것이 가능한가?

+0

여기에서 달성하고자하는 것은 분명하지 않습니다. 'DurationType'을 함수의 템플릿 매개 변수로 승격시키는 것이 왜 그것의 인터페이스에도 나타나지 않는 이유는 무엇입니까? 유일하게 템플릿 매개 변수로'ReturnType'을 가질 수 있고'DurationType'을'auto'로 대체 할 수 있습니다. –

답변

1

정확히 무엇을 표현하고 싶습니까? 기본값을 원하는 것이 무엇입니까?

예를 들어 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(); 
} 

그러나 같은이 기능은 ReturnT 다른 반환 유형으로 DurationT 호출되는 것을 허용?

뜻은 다음과 같습니다.

foo0<long double, std::chrono::duration<float, std::milli>>(); 

나는 그렇지 않다고 생각해.

그래서 나는 하나의 유형 만 표현하고 다른 하나는 파생해야한다고 생각합니다.

std::chrono::duration<float, std::milli> 기본값으로 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(); 
} 

또는 기본 float과 함께 ReturnT을 표현하고,에서 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(); 
} 
+0

템플릿 템플리트를 사용해야한다는 생각을 계속합니다. 템플릿에 다른 템플릿이 있기 때문입니다. – ChaoSXDemon

+0

@ChaoSXDemon - 유용한 상황이 있습니다. 그러나 나는이 경우에 생각하지 않는다. – max66