문제

나는 최근에 D 언어를 가지고 놀았으며 템플릿에 대한 빠른 질문이 있습니다.

캐릭터와 문자열을 코드의 기존 문자열에 삽입 하고이 기능을 생각해 냈습니다.

string insert(T)(string s1, T s2, uint position) {
    return s1[0 .. position] ~ s2 ~ s1[position .. $];
}

이제 몇 가지 질문이 있습니다.

  1. S2 인수에 허용되는 유형을 제한 할 수 있습니까 (char, wchar, dchar 등과 해당 배열 값 만 원합니다)?

  2. 위치 arg가 0인지 자동으로 알 수있는 템플릿을 정의 할 수있는 방법이 있습니까? 이와 같은 것 (컴파일하지는 않지만 일반적인 아이디어를 제공하는 것) :

    string insert(T)(string s1, T s2, uint position) {
      static if (position == 0)
        return "" ~ s2 ~ s1;
      else
        return s1[0 .. position] ~ s2 ~ s1[position .. $];
    }
    

감사

도움이 되었습니까?

해결책

  1. 예 - 어느 쪽이든 사용합니다 템플릿 매개 변수 전문화 또는 템플릿 제약 조건 (C ++ 1X 개념에 해당).
  2. static if 조건은 컴파일 시간에 계산할 수 있음을 의미합니다. 함수 매개 변수는 될 수 없으므로 일반을 사용하십시오. if 또는 만들기 position 템플릿 매개 변수.

다른 팁

1의 경우 실제로 허용 가능한 유형을 제한 할 수있는 두 곳이 있습니다.

첫 번째는입니다 ~ 전에 방법 선택. 기호가 여러 메소드로 해결되면 컴파일러는 사용해야 할 것을 시도하고 결정하기 전에 가능한 한 많은 것을 제거하려고합니다. 이 단계에서 템플릿 제약 조건 (D2 만 해당) 및 전문화 작업이 작동합니다. 예를 들어:

string insert(T)(string s1, T s2, uint position) if(isSomeChar!T) // D2 only

-또는-

string insert(T : dchar)(string s1, T s2, uint position) // D1 or D2

다른 하나는 ~ 후에 방법 선택. 이것은 컴파일러가 이미이 특정 방법을 사용하기로 결정한 곳입니다. 정적 어제 로이 작업을 수행 할 수 있습니다. 이로 인해 컴파일러가 "OOH; 다른 과부하를 찾아야합니다!"; 단순히 포기할 것입니다.

string insert(T)(string s1, T s2, uint position)
{
    static if( !isSomeChar!(T) )
    {
        pragma(msg, "Error: insert(T): T must be a character type.");
        static assert(false);
    }
    ...
}

또 다른 한 가지 : 내가 아는 한, 당신은 ** **를 단순히 whars와 dchars를 문자열 (숯불 배열)으로 연결할 수 없습니다. 먼저 문자를 문자열로 인코딩해야합니다. encode 에서 std.utf 모듈은 트릭을 수행해야합니다.

2는 일반 if 문을 사용할 수 없습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top