2013-07-06 3 views
1

템플릿 래퍼 Bound에 대한 인스턴스 작성기 기능을 구현하려고하는데 작동하지 않습니다. 나는 우리가 에이다 에서 D.바운딩 템플릿 용 Instantisator 함수가 컴파일되지 않습니다.

내가 원하는입니다

/** Bounded Value of Type T. */ 
struct Bound(T, 
      T min = T.min, 
      T max = T.max, 
      bool Exceptional = true) { 
... 
} 

auto x = bound!(0.0, 10.0)(1.0); 

로 인스턴스화이 템플릿을 원하는

로 전환해야 직장에서 사람들을 설득하기 위해이 필요 첫 번째 템플리트 인수 T은 템플리트 매개 변수 minmax의 값에 의해 유추됩니다. 하지만 템플릿 매개 변수를 기본값으로 지정하려면 어떻게해야합니까? 물론

나는 항상

auto bound(float min, float max, bool Exceptional = true)(float value) { 
    return Bound!(float, min, max, Exceptional)(value); 
} 

을 할 수 있지만, 어떻게 bound 템플릿을해야합니까?

+1

이 문제는 해결된다? 그렇다면 솔루션을 답으로 사용할 수 있습니다. 그렇지 않다면 질문을 더 명확하게 할 수 있습니까? – tjameson

+1

예, 그렇게하십시오. 많은 해결 된 질문을 답이없는 혼란으로 표시하면 검색 결과가 질문에 대한 답을 빨리 얻을 가능성이 줄어 듭니다. – klickverbot

+0

질문이 업데이트되었습니다. 지연 돼서 죄송합니다. –

답변

1

해결의 조금,하지만이 작동합니다

import std.traits; 

template bound(alias min, alias max, bool Exceptional = true) 
    if (!is(CommonType!(typeof(min), typeof(max)) == void)) 
{ 
    auto bound(CommonType!(typeof(min), typeof(max)) value) { 
     return Bound!(typeof(value), min, max, Exceptional)(value); 
    } 
} 

을 그리고 그것은 다음과 같이 작동 : 그래서

void main() 
{ 
    auto a = bound!(0.0f, 2.0f)(1.0f); 
    auto b = bound!(0, 2)(1); 

    import std.stdio; 
    writeln(typeof(a).stringof); // Bound!(float, 0.00000F, 2.00000F, true) 
    writeln(typeof(b).stringof); // Bound!(int, 0, 2, true) 
} 
+0

아하. '별칭'이 핵심이었습니다. 좋은. 다시 피터 Thx. –

관련 문제