2016-06-19 3 views
0

다음 예제에서는 std :: chrono 라이브러리를 사용하여 기본 타이머의 지속 시간을 허용하는 방법을 찾고 있습니다. 시간 템플릿 키워드의 조건에 일치하지 않는하위 클래스의 템플릿을 템플릿 용 템플릿으로 허용

template <std::chrono::duration D> //Accept either std::chrono::minute, second, etc... 
class myTimer{ 


} 

그러나이 작동하지 않습니다.

template <class T> 
class myTimer{ 

    //I could do a static cast, but Duration is only a template used by the children, not an actual class per say. 

} 

제 궁금한 점은 무엇입니까? 코드가 적어지고 사용성이 좋을 때 가장 좋은 해결책은 무엇입니까? 템플릿에서 알 수없는 자식을 가진 정적 캐스트가 제대로 작동하지 않는 것처럼 느껴지지만 완전히 잘못되었을 수 있습니다.

+1

가능한 복제본 [템플릿 매개 변수로 std :: chrono :: duration을 어떻게 사용할 수 있습니까?] (http://stackoverflow.com/questions/28875853/how-can-i-use-stdchronoduration-as-a) -template-parameter) –

답변

0

당신은 여기에서 매우 쉽고 유연하지는 않지만 매우 유연하지만 더 많은 작업에 이르기까지 다양한 옵션을 제공합니다.

class myTimer 
{ 
    std::chrono::nanoseconds time_; 
    ... 
}; 

생성자 그냥 nanoseconds을 수행 할 수 있습니다

가장 쉬운 것은 단지 nanoseconds를 저장하고, 모든 myTimer을 템플릿을하지 않는 것입니다. 은 "내장"크로노 단위의 모든 암시 적 nanoseconds로 변환됩니다

myTimer t{3min}; // ok, 180'000'000'000ns 

여기 유일한 단점은 모든duration 암시 nanoseconds로 변환 할 수 없습니다 이다. 아마도 클라이언트가 피코 초, 1/60s 단위 또는 부동 소수점 지속 시간을 사용할 수 있기를 원할 것입니다. 또는 여기에 의도 한 내용은 타이머 내부의 저장 영역 정밀도를 제어하는 ​​것입니다 (실제로 필요하지는 않지만, 그러나 당신은 결코 모른다).

템플릿으로 시작하는 템플릿은 시작하기에 좋지 않습니다.

template <class T> 
struct is_duration 
    : public std::false_type 
    {}; 

template <class Rep, class Period> 
struct is_duration<std::chrono::duration<Rep, Period>> 
    : public std::true_type 
    {}; 

지금 당신이 is_duration<T>{}을 말할 수있는이 허위의 사실 중 하나에 대답하는 컴파일 시간이 BOOL 인 :이 프로젝트를 위해 사용하지 않을 결국하더라도, 그것은 다른에 편리 할 수 ​​있습니다. 이 같은 (예를 들어)이 사용할 수 :이 std::chrono::duration 아무것도하지만에 인스턴스 생성을 컴파일 할 수 없게됩니다

template <class D, 
      class = std::enable_if_t<is_duration<D>{}>> 
class myTimer 
{ 
    D time_; 
}; 

.

또한 is_duration을 필요로하지 않습니다이 방법을 취할 수 :

template <class D> class myTimer; 

template <class Rep, class Period> 
class myTimer<std::chrono::duration<Rep, Period>> 
{ 
}; 

이 경로를 탐험에 관심이 경우 두 가지 방법을 시도하고 당신이 가장 좋아하는 오류 메시지를 결정합니다.

잊지 마세요. 가장 좋은 해결책은 가장 쉽습니다. nanoseconds을 사용하고 모든 것을 구체적으로 만드십시오.

+0

나노초를 사용할 수 있고 시간을 얻기 위해 비율을 기반으로하는 get 메서드를 반환 할 수 있습니다 ... 내 목표는 시간, 분, 초, 밀리 초 등을 추적하는 타이머를 만드는 것입니다. .. 클래스 객체를 정의 할 때 개발자가 typename으로 선택한 것을 기반으로합니다. 내가 그것을 지나치게 복잡하게 만들었지 만. –

+0

템플릿 위에 클래스를 선택하는 이유가 있습니까? –

+0

@TravisTruttschel : 귀하의 질문을 이해할 수 있는지 잘 모르겠습니다. 내가 할 수있는 한 당신의 질문과 비슷한 것을 던지려고했고, 비 템플릿 기반 클래스에서부터 클래스 템플릿에 이르는 다양한 솔루션을 제시했다. –

관련 문제