문제
나는 최근에 D 언어를 가지고 놀았으며 템플릿에 대한 빠른 질문이 있습니다.
캐릭터와 문자열을 코드의 기존 문자열에 삽입 하고이 기능을 생각해 냈습니다.
string insert(T)(string s1, T s2, uint position) {
return s1[0 .. position] ~ s2 ~ s1[position .. $];
}
이제 몇 가지 질문이 있습니다.
S2 인수에 허용되는 유형을 제한 할 수 있습니까 (char, wchar, dchar 등과 해당 배열 값 만 원합니다)?
위치 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 .. $]; }
감사
해결책
- 예 - 어느 쪽이든 사용합니다 템플릿 매개 변수 전문화 또는 템플릿 제약 조건 (C ++ 1X 개념에 해당).
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 문을 사용할 수 없습니까?